capnproto-java-rpc/runtime/src/main/java/org/capnproto/Request.java

72 lines
2.5 KiB
Java
Raw Normal View History

package org.capnproto;
import java.util.concurrent.CompletableFuture;
public class Request<Params, Results> {
2020-09-29 13:08:23 +00:00
AnyPointer.Builder params;
private final FromPointerBuilder<Params> paramsBuilder;
private final FromPointerReader<Results> resultsReader;
2020-09-29 11:24:49 +00:00
RequestHook hook;
2020-09-29 13:08:23 +00:00
Request(FromPointerBuilder<Params> paramsBuilder,
FromPointerReader<Results> resultsReader,
AnyPointer.Builder params, RequestHook hook) {
this.paramsBuilder = paramsBuilder;
this.resultsReader = resultsReader;
this.params = params;
this.hook = hook;
}
2020-09-29 13:08:23 +00:00
Params params() {
return params.getAs(paramsBuilder);
}
2020-10-08 14:35:15 +00:00
RemotePromise<Results> send() {
2020-09-28 21:16:38 +00:00
var typelessPromise = hook.send();
hook = null; // prevent reuse
2020-10-08 14:35:15 +00:00
var typedPromise = typelessPromise.getResponse().thenApply(response -> {
return new Response<Results>(
resultsReader,
response.get(),
response.hook);
});
return new RemotePromise<Results>(typedPromise, typelessPromise.pipeline);
}
static <T, U> Request<T, U> newBrokenRequest(Throwable exc) {
final MessageBuilder message = new MessageBuilder();
var hook = new RequestHook() {
@Override
public RemotePromise<AnyPointer.Reader> 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);
2020-09-29 13:08:23 +00:00
return new Request<T, U>(null, null, root, hook);
}
static Request<AnyPointer.Builder, AnyPointer.Reader> newTypelessRequest(AnyPointer.Builder root, RequestHook hook) {
return new Request<>(AnyPointer.factory, AnyPointer.factory, root, hook);
}
static <Params, Results> Request<Params, Results> fromTypeless(FromPointerBuilder<Params> params,
FromPointerReader<Results> results,
Request<AnyPointer.Builder, AnyPointer.Reader> typeless) {
return new Request<>(params, results, typeless.params(), typeless.hook);
}
}