package org.capnproto; import java.util.concurrent.CompletableFuture; public class Request { AnyPointer.Builder params; private final FromPointerBuilder paramsBuilder; private final FromPointerReader resultsReader; RequestHook hook; Request(FromPointerBuilder paramsBuilder, FromPointerReader resultsReader, AnyPointer.Builder params, RequestHook hook) { this.paramsBuilder = paramsBuilder; this.resultsReader = resultsReader; this.params = params; this.hook = hook; } Params params() { return params.getAs(paramsBuilder); } CompletableFuture send() { var typelessPromise = hook.send(); hook = null; // prevent reuse return typelessPromise.getResponse().thenApply( response -> response.getAs(resultsReader)); } static Request newBrokenRequest(Throwable exc) { final MessageBuilder message = new MessageBuilder(); var hook = new RequestHook() { @Override public RemotePromise send() { return new RemotePromise<>(CompletableFuture.failedFuture(exc), null); } @Override public CompletableFuture sendStreaming() { return CompletableFuture.failedFuture(exc); } @Override public Object getBrand() { return null; } }; var root = message.getRoot(AnyPointer.factory); return new Request(null, null, root, hook); } static Request newTypelessRequest(AnyPointer.Builder root, RequestHook hook) { return new Request<>(AnyPointer.factory, AnyPointer.factory, root, hook); } static Request fromTypeless(FromPointerBuilder params, FromPointerReader results, Request typeless) { return new Request<>(params, results, typeless.params(), typeless.hook); } }