123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126moduleLog=Capnp_rpc_proto.Debug.LogmoduleB=Schema.BuildermoduleR=Schema.ReadermoduleRO_array=Capnp_rpc_proto.RO_arraymoduleStructStorage=Capnp.Message.BytesMessage.StructStoragetypeCapnp.MessageSig.attachments+=RPC_attachmentsofCapnp_rpc_proto.S.attachmentsmodulePath=structtypet=Xform.tlistletcompare=compareletpp=Fmt.Dump.listXform.ppletroot=[]endtyperequest=[`Call_836a53ce789d4cd4]typeresponse=[`Return_9e19b28d3db3573a]type'amsg=|Builderof'aStructStorage.builder_t|Readonlyof'aStructStorage.reader_t(* We can sometimes avoid a copy by returning the builder directly.
e.g. the application code builds a call and passes it to a proxy, which transmits
it over the network. A message can only be transmitted once. *)letwith_attachmentsat=matchtwith|Builderx->Builder(StructStorage.with_attachments(RPC_attachmentsa)x)|ReadonlyNone->ReadonlyNone|Readonly(Somex)->Readonly(Some(StructStorage.with_attachments(RPC_attachmentsa)x))letunwrap_attachments=function|RPC_attachmentsx->x|Capnp.MessageSig.No_attachments->Capnp_rpc_proto.S.No_attachments|_->failwith"Unknown attachment type!"letattachments=function|ReadonlyNone->Capnp_rpc_proto.S.No_attachments|Readonly(Somess)->unwrap_attachments@@StructStorage.get_attachmentsss|Builderss->unwrap_attachments@@StructStorage.get_attachmentsssletwrap_attachmentsa=RPC_attachmentsamoduleRequest=structtypet=requestmsg(* Call message with interface_id, method_id and payload.content filled in *)letcopyrcall=(* todo: set init size from src; also for copy_resp *)letmsg=B.Message.init_root()inletcall=B.Message.call_initmsginB.Call.interface_id_setcall(R.Call.interface_id_getrcall);B.Call.method_id_set_exncall(R.Call.method_id_getrcall);(* Only copy the contents, not the caps. *)letpayload=B.Call.params_initcallinletrpayload=R.Call.params_getrcallinB.Payload.content_set_readerpayload(R.Payload.content_getrpayload)|>ignore;callletwritable:t->_=function|Readonlycall->copycall|Buildercall->callletreadable=function|Readonlycall->call|Buildercall->R.Call.of_buildercallletof_builderx=Builderxletof_readerx=Readonlyxletcap_indextpath=letcall=readabletinXform.resolve(R.Call.params_getcall)pathletppf_=Fmt.stringf"(request content)"letwith_attachments=with_attachmentsletattachments=attachmentsendmoduleResponse=structtypet=responsemsgletcopy(rret:R.Return.t)=letmsg=B.Message.init_root()inletret=B.Message.return_initmsginbeginmatchR.Return.getrretwith|R.Return.Resultsrpayload->(* Only copy the contents, not the caps. *)letpayload=B.Return.results_initretinB.Payload.content_set_readerpayload(R.Payload.content_getrpayload)|>ignore|_->failwith"Not a results message!"end;retletwritable=function|Readonlyx->copyx|Builderret->retletreadableresp=letresp=matchrespwith|Readonlyx->x|Builderx->R.Return.of_builderxinmatchR.Return.getrespwith|R.Return.Resultsr->r|_->assertfalseletbootstrap()=letmsg=B.Message.init_root~message_size:150()inletret=B.Message.return_initmsginletp=B.Return.results_initretinB.Payload.content_set_interfacep(SomeStdint.Uint32.zero);(* Cap index 0 *)Builderretletof_builderx=Builderxletof_readerx=Readonlyxletcap_indextpath=letresults=readabletinXform.resolveresultspathletppf_=Fmt.stringf"(response content)"letwith_attachments=with_attachmentsletattachments=attachmentsend