diff --git a/runtime/src/main/java/org/capnproto/PipelineOp.java b/runtime/src/main/java/org/capnproto/PipelineOp.java index 5232d30..067954f 100644 --- a/runtime/src/main/java/org/capnproto/PipelineOp.java +++ b/runtime/src/main/java/org/capnproto/PipelineOp.java @@ -22,4 +22,39 @@ final class PipelineOp { static PipelineOp PointerField(short pointerIndex) { return new PipelineOp(Type.GET_POINTER_FIELD, pointerIndex); } + + static void FromPipelineOps(PipelineOp[] ops, RpcProtocol.PromisedAnswer.Builder builder) { + var transforms = builder.initTransform(ops.length); + for (int ii = 0; ii < ops.length; ++ii) { + switch (ops[ii].type) { + case NOOP: + transforms.get(ii).setNoop(null); + break; + case GET_POINTER_FIELD: + transforms.get(ii).setGetPointerField(ops[ii].pointerIndex); + break; + } + } + } + + static PipelineOp[] ToPipelineOps(RpcProtocol.PromisedAnswer.Reader reader) { + var transforms = reader.getTransform(); + var ops = new PipelineOp[transforms.size()]; + for (int ii = 0; ii < ops.length; ++ii) { + var transform = transforms.get(ii); + switch (transform.which()) { + case NOOP: + ops[ii] = Noop(); + break; + case GET_POINTER_FIELD: + ops[ii] = PointerField(transform.getGetPointerField()); + break; + default: + // TODO improve error handling here + // Unsupported pipeline ops + return null; + } + } + return ops; + } }