Пример #1
0
        public static Task <TResOut> StartAsTask <TReq, TResIn, TResOut>([NotNull] this IRdCall <TReq, TResIn> call, TReq arg, bool useSyncResponse, [NotNull] Func <TResIn, TResOut> func)
        {
            if (call == null)
            {
                throw new ArgumentNullException(nameof(call));
            }
            var rdTask = call.Start(arg, useSyncResponse ? SynchronousScheduler.Instance : null);
            var tcs    = new TaskCompletionSource <TResOut>();

            rdTask.Result.AdviseOnce(Lifetime.Eternal, result =>
            {
                switch (result.Status)
                {
                case RdTaskStatus.Success:
                    tcs.SetResult(func(result.Result));
                    break;

                case RdTaskStatus.Canceled:
                    tcs.SetCanceled();
                    break;

                case RdTaskStatus.Faulted:
                    tcs.SetException(result.Error);
                    break;

                default:
                    Assertion.Fail($"Unexpected task status {result.Status}");
                    break;
                }
            });
            return(tcs.Task);
        }
Пример #2
0
        public void BindCall <TReq, TRes>(IRdCall <TReq, TRes> call, Func <Lifetime, TReq, RdTask <TRes> > handler)
        {
            EnsureBindableChildren();
            // todo: support for real protocol
            var inProcRpc = (call as InprocRpc <TReq, TRes>).NotNull(nameof(call) + " != null");

            inProcRpc.SetHandler(handler);
        }
Пример #3
0
        private ILinkResponse TryParseFullName([NotNull] string s, [NotNull] StringRange range,
                                               IRdCall <FString, bool> isBlueprintPathName)
        {
            var path = new FString(s);

            return(isBlueprintPathName.Sync(path)
                ? new LinkResponseBlueprint(path, range)
                : null);
        }
Пример #4
0
        private ILinkResponse TryParseFullName([NotNull] string s, [NotNull] StringRange range,
                                               IRdCall <FString, bool> isBlueprintPathName)
        {
            var path = new FString(s);

            try
            {
                return(isBlueprintPathName.Sync(path)
                    ? new LinkResponseBlueprint(path, range)
                    : null);
            }
            catch (Exception e)
            {
                _logger.Warn(e, "[UnrealLink]: Failed to parse Blueprint string");
                return(null);
            }
        }
Пример #5
0
        internal ILinkResponse ResolveLink(LinkRequest @struct, IRdCall <FString, bool> isBlueprintPathName)
        {
            // ReSharper disable once LocalFunctionCanBeMadeStatic
            string SqueezeBorders(string s, out int l, out int r)
            {
                l = 0;
                r = s.Length;
                if (s.EndsWith("."))
                {
                    --r;
                }

                if (PairSymbol.TryGetValue(s[r - 1], out var value))
                {
                    l = s.AsSpan(l, r - l - 1).LastIndexOf(value) + 1;
                    --r;
                }

                return(s.Substring(l, r - l));
            }

            var link     = @struct.Data.Data;
            var squeezed = SqueezeBorders(link, out var left, out var right);
            var range    = new StringRange(left, right);

            var fullPath = TryParseFullPath(squeezed, range);

            if (fullPath != null)
            {
                return(fullPath);
            }

            var fullName = TryParseFullName(squeezed, range, isBlueprintPathName);

            if (fullName != null)
            {
                return(fullName);
            }


            return(new LinkResponseUnresolved());
        }
Пример #6
0
 public static Task <TRes> StartAsTask <TReq, TRes>([NotNull] this IRdCall <TReq, TRes> call, TReq arg)
 {
     return(StartAsTask(call, arg, false, x => x));
 }
Пример #7
0
 public static Task <TResOut> StartAsTask_SyncResponse <TReq, TResIn, TResOut>([NotNull] this IRdCall <TReq, TResIn> call, TReq arg, [NotNull] Func <TResIn, TResOut> func)
 {
     return(StartAsTask(call, arg, true, func));
 }
Пример #8
0
 public static Task <TRes> StartAsTask_SyncResponse <TReq, TRes>([NotNull] this IRdCall <TReq, TRes> call, TReq arg)
 {
     return(StartAsTask(call, arg, true, x => x));
 }