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); }
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); }
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); }
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); } }
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()); }
public static Task <TRes> StartAsTask <TReq, TRes>([NotNull] this IRdCall <TReq, TRes> call, TReq arg) { return(StartAsTask(call, arg, false, x => x)); }
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)); }
public static Task <TRes> StartAsTask_SyncResponse <TReq, TRes>([NotNull] this IRdCall <TReq, TRes> call, TReq arg) { return(StartAsTask(call, arg, true, x => x)); }