123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255moduleOt=Pb_codegen_ocaml_typemoduleF=Pb_codegen_formattingletspf=Printf.sprintfletocaml_type_of_rpc_type(rpc:Ot.rpc_type):string*string=matchrpcwith|Rpc_scalarty->Pb_codegen_util.string_of_field_typety,"unary"|Rpc_streamty->Pb_codegen_util.string_of_field_typety,"stream"letstring_of_server_rpc(req:Ot.rpc_type)(res:Ot.rpc_type):string=letreq,req_mode=ocaml_type_of_rpc_typereqinletres,res_mode=ocaml_type_of_rpc_typeresinspf"(%s, %s, %s, %s) Server.rpc"reqreq_moderesres_modeletfunction_name_encode_json~service_name~rpc_name(ty:Ot.rpc_type):string=letfty=matchtywith|Ot.Ft_unit->"(fun () -> `Assoc [])"|Ot.Ft_user_defined_typeudt->letfunction_prefix="encode_json"inPb_codegen_util.function_name_of_user_defined~function_prefixudt|_->Printf.eprintf"cannot json-encode request for %s in service %s\n%!"rpc_nameservice_name;exit1inmatchtywith|Ot.Rpc_scalarty|Ot.Rpc_streamty->ftyletfunction_name_decode_json~service_name~rpc_name(ty:Ot.rpc_type):string=letfty=matchtywith|Ot.Ft_unit->"(fun _ -> ())"|Ot.Ft_user_defined_typeudt->letfunction_prefix="decode_json"inPb_codegen_util.function_name_of_user_defined~function_prefixudt|_->Printf.eprintf"cannot decode json request for %s in service %s\n%!"rpc_nameservice_name;exit1inmatchtywith|Ot.Rpc_scalarty|Ot.Rpc_streamty->ftyletfunction_name_encode_pb~service_name~rpc_name(ty:Ot.rpc_type):string=letfty=matchtywith|Ot.Ft_unit->"(fun () enc -> Pbrt.Encoder.empty_nested enc)"|Ot.Ft_user_defined_typeudt->letfunction_prefix="encode_pb"inPb_codegen_util.function_name_of_user_defined~function_prefixudt|_->Printf.eprintf"cannot binary-encode request for %s in service %s\n%!"rpc_nameservice_name;exit1inmatchtywith|Ot.Rpc_scalarty|Ot.Rpc_streamty->ftyletfunction_name_decode_pb~service_name~rpc_name(ty:Ot.rpc_type):string=letfty=matchtywith|Ot.Ft_unit->"(fun d -> Pbrt.Decoder.empty_nested d)"|Ot.Ft_user_defined_typeudt->letfunction_prefix="decode_pb"inPb_codegen_util.function_name_of_user_defined~function_prefixudt|_->Printf.eprintf"cannot decode binary request for %s in service %s\n%!"rpc_nameservice_name;exit1inmatchtywith|Ot.Rpc_scalarty|Ot.Rpc_streamty->ftyletmod_name_for_client(service:Ot.service):string=String.capitalize_asciiservice.service_nameletstring_list_of_package(path:stringlist):string=spf"[%s]"(String.concat";"@@List.map(funs->spf"%S"s)path)letgen_service_client_struct(service:Ot.service)sc:unit=letservice_name=service.service_nameinF.linesc"module Client = struct";letgen_rpcsc(rpc:Ot.rpc)=F.linepsc"open Pbrt_services";letrpc_name=rpc.rpc_nameinletreq,req_mode=ocaml_type_of_rpc_typerpc.rpc_reqinletreq_mode_witness=String.capitalize_asciireq_modeinletres,res_mode=ocaml_type_of_rpc_typerpc.rpc_resinletres_mode_witness=String.capitalize_asciires_modeinF.empty_linesc;F.linepsc"let %s : (%s, %s, %s, %s) Client.rpc ="(Pb_codegen_util.function_name_of_rpcrpc)reqreq_moderesres_mode;F.linepsc" (Client.mk_rpc ";F.linepsc" ~package:%s"(string_list_of_packageservice.service_packages);F.linepsc" ~service_name:%S ~rpc_name:%S"service.service_namerpc.rpc_name;F.linepsc" ~req_mode:Client.%s"req_mode_witness;F.linepsc" ~res_mode:Client.%s"res_mode_witness;F.linepsc" ~encode_json_req:%s"(function_name_encode_json~service_name~rpc_namerpc.rpc_req);F.linepsc" ~encode_pb_req:%s"(function_name_encode_pb~service_name~rpc_namerpc.rpc_req);F.linepsc" ~decode_json_res:%s"(function_name_decode_json~service_name~rpc_namerpc.rpc_res);F.linepsc" ~decode_pb_res:%s"(function_name_decode_pb~service_name~rpc_namerpc.rpc_res);letreq,req_mode=ocaml_type_of_rpc_typerpc.rpc_reqinletres,res_mode=ocaml_type_of_rpc_typerpc.rpc_resinF.linepsc" () : (%s, %s, %s, %s) Client.rpc)"reqreq_moderesres_modeinF.sub_scopesc(funsc->List.iter(gen_rpcsc)service.service_body);F.linesc"end"letgen_service_server_struct(service:Ot.service)sc:unit=letservice_name=service.service_namein(* generate rpc descriptions for the server side *)letgen_rpcsc(rpc:Ot.rpc)=F.empty_linesc;letrpc_name=rpc.rpc_nameinletname=Pb_codegen_util.function_name_of_rpcrpcinletreq,req_mode=ocaml_type_of_rpc_typerpc.rpc_reqinletres,res_mode=ocaml_type_of_rpc_typerpc.rpc_resinletreq_mode_witness=String.capitalize_asciireq_modeinletres_mode_witness=String.capitalize_asciires_modeinF.linepsc"let %s : (%s,%s,%s,%s) Server.rpc = "namereqreq_moderesres_mode;F.linepsc" (Server.mk_rpc ~name:%S"rpc.rpc_name;F.linepsc" ~req_mode:Server.%s"req_mode_witness;F.linepsc" ~res_mode:Server.%s"res_mode_witness;F.linepsc" ~encode_json_res:%s"(function_name_encode_json~service_name~rpc_namerpc.rpc_res);F.linepsc" ~encode_pb_res:%s"(function_name_encode_pb~service_name~rpc_namerpc.rpc_res);F.linepsc" ~decode_json_req:%s"(function_name_decode_json~service_name~rpc_namerpc.rpc_req);F.linepsc" ~decode_pb_req:%s"(function_name_decode_pb~service_name~rpc_namerpc.rpc_req);F.linepsc" () : _ Server.rpc)"inletgen_serversc=letrpc_parameter_namename=spf"__handler__%s"nameinF.linesc"open Pbrt_services";List.iter(gen_rpcsc)service.service_body;(* now generate a function from the module type to a [Service_server.t] *)F.empty_linesc;F.linepsc"let make";List.iter(fun(rpc:Ot.rpc)->letname=Pb_codegen_util.function_name_of_rpcrpcinF.linepsc" ~%s:%s"name(rpc_parameter_namename))service.service_body;F.linesc" () : _ Server.t =";F.linepsc" { Server.";F.linepsc" service_name=%S;"service_name;F.linepsc" package=%s;"(string_list_of_packageservice.service_packages);F.linesc" handlers=[";List.iter(fun(rpc:Ot.rpc)->letname=Pb_codegen_util.function_name_of_rpcrpcinF.linepsc" (%s %s);"(rpc_parameter_namename)name)service.service_body;F.linesc" ];";F.linesc" }"inF.empty_linesc;F.linesc"module Server = struct";F.sub_scopescgen_server;F.linesc"end";F.empty_linescletgen_service_struct(service:Ot.service)sc:unit=F.linepsc"module %s = struct"(mod_name_for_clientservice);F.sub_scopesc(funsc->F.linepsc"open Pbrt_services.Value_mode";gen_service_client_structservicesc;(* now the server side *)gen_service_server_structservicesc);F.linesc"end";F.empty_linescletgen_service_sig(service:Ot.service)sc:unit=F.linepsc"(** %s service *)"service.service_name;F.linepsc"module %s : sig"(mod_name_for_clientservice);F.sub_scopesc(funsc->F.linepsc"open Pbrt_services";F.linepsc"open Pbrt_services.Value_mode";(* client *)letgen_client_rpcsc(rpc:Ot.rpc)=F.empty_linesc;letreq,req_mode=ocaml_type_of_rpc_typerpc.rpc_reqinletres,res_mode=ocaml_type_of_rpc_typerpc.rpc_resinF.linepsc"val %s : (%s, %s, %s, %s) Client.rpc"(Pb_codegen_util.function_name_of_rpcrpc)reqreq_moderesres_modeinF.empty_linesc;F.linesc"module Client : sig";F.sub_scopesc(funsc->List.iter(gen_client_rpcsc)service.service_body);F.linesc"end";(* server *)F.empty_linesc;F.linesc"module Server : sig";F.sub_scopesc(funsc->F.linesc"(** Produce a server implementation from handlers *)";F.linepsc"val make : ";List.iter(fun(rpc:Ot.rpc)->F.linepsc" %s:(%s -> 'handler) ->"(Pb_codegen_util.function_name_of_rpcrpc)(string_of_server_rpcrpc.rpc_reqrpc.rpc_res))service.service_body;F.linepsc" unit -> 'handler Pbrt_services.Server.t";F.empty_linesc;F.linesc"(** The individual server stubs are only exposed for advanced \
users. Casual users should prefer accessing them through {!make}. \
*)";List.iter(fun(rpc:Ot.rpc)->F.empty_linesc;letname=Pb_codegen_util.function_name_of_rpcrpcinletreq,req_mode=ocaml_type_of_rpc_typerpc.rpc_reqinletres,res_mode=ocaml_type_of_rpc_typerpc.rpc_resinF.linepsc"val %s : (%s,%s,%s,%s) Server.rpc"namereqreq_moderesres_mode)service.service_body);F.linesc"end";());F.linesc"end";F.empty_linesc