123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189moduleOt=Pb_codegen_ocaml_typeletspx=Printf.sprintfxletlet_decl_of_and=function|Some_->"and"|None->"let rec"letstring_of_basic_type?(for_pp=false)=function|Ot.Bt_string->"string"|Ot.Bt_float->"float"|Ot.Bt_int->"int"|Ot.Bt_int32->"int32"|Ot.Bt_uint32->iffor_ppthen"unsigned_of_int32"else"[`unsigned of int32]"|Ot.Bt_int64->"int64"|Ot.Bt_uint64->iffor_ppthen"unsigned_of_int64"else"[`unsigned of int64]"|Ot.Bt_bytes->"bytes"|Ot.Bt_bool->"bool"letstring_of_user_defined?module_prefix=function|{Ot.udt_module_prefix=None;Ot.udt_type_name;_}->(matchmodule_prefixwith|None->udt_type_name|Somemodule_prefix->module_prefix^"."^udt_type_name)|{Ot.udt_module_prefix=Somemodule_prefix;Ot.udt_type_name;_}->module_prefix^"."^udt_type_nameletstring_of_field_type?for_pp?module_prefix=function|Ot.Ft_unit->"unit"|Ot.Ft_basic_typebt->string_of_basic_type?for_ppbt|Ot.Ft_user_defined_typeudt->string_of_user_defined?module_prefixudt|Ot.Ft_wrapper_type{Ot.wt_type;wt_pk=_}->string_of_basic_type?for_ppwt_type^" option"letstring_of_repeated_type=function|Ot.Rt_list->"list"|Ot.Rt_repeated_field->"Pbrt.Repeated_field.t"letstring_of_associative_type=function|Ot.At_list->"list"|Ot.At_hashtable->"Hashtbl.t"letstring_of_record_field_type?module_prefix=function|Ot.Rft_nolabel(field_type,_,_)|Ot.Rft_required(field_type,_,_,_)->string_of_field_type?module_prefixfield_type|Ot.Rft_optional(field_type,_,_,_)->string_of_field_type?module_prefixfield_type^" option"|Ot.Rft_repeated(rt,field_type,_,_,_)->string_of_field_type?module_prefixfield_type^" "^string_of_repeated_typert|Ot.Rft_associative(Ot.At_list,_,(key_type,_),(value_type,_))->Printf.sprintf"(%s * %s) %s"(string_of_basic_typekey_type)(string_of_field_type?module_prefixvalue_type)(string_of_associative_typeOt.At_list)|Ot.Rft_associative(Ot.At_hashtable,_,(key_type,_),(value_type,_))->Printf.sprintf"(%s, %s) %s"(string_of_basic_typekey_type)(string_of_field_type?module_prefixvalue_type)(string_of_associative_typeOt.At_hashtable)|Ot.Rft_variant{Ot.v_name;_}->(matchmodule_prefixwith|None->v_name|Somemodule_prefix->module_prefix^"."^v_name)(** [function_name_of_user_defined prefix user_defined] returns the function
name of the form `(module'.'?)prefix_(type_name)`.
This pattern is common since a generated function for a type
(encode/decode/to_string) will call the same generated function for each
user defined field type.
*)letfunction_name_of_user_defined~function_prefix=function|{Ot.udt_module_prefix=Somemodule_prefix;Ot.udt_type_name;_}->sp"%s.%s_%s"module_prefixfunction_prefixudt_type_name|{Ot.udt_module_prefix=None;Ot.udt_type_name;_}->sp"%s_%s"function_prefixudt_type_nameletmodule_type_name_of_service_client(service:Ot.service):string=String.uppercase_asciiservice.service_name^"_CLIENT"letmodule_type_name_of_service_server(service:Ot.service):string=String.uppercase_asciiservice.service_name^"_SERVER"letfunction_name_of_rpc_reserved_keywords_list=["make"]letfunction_name_of_rpc(rpc:Ot.rpc)=letcandidate=String.uncapitalize_asciirpc.rpc_nameinifList.memcandidatefunction_name_of_rpc_reserved_keywords_listthencandidate^"_"elsecandidateletcaml_file_name_of_proto_file_name~proto_file_name=letsplitted=Pb_util.rev_split_by_char'.'proto_file_nameinifList.lengthsplitted<2||List.hdsplitted<>"proto"thenfailwith"Proto file has no valid extension"elseString.concat"_"@@List.rev@@List.tlsplittedletmutable_record_names=s^"_mutable"letstring_of_payload_kind?capitalizepayload_kindpacked=lets=matchpayload_kind,packedwith|Ot.Pk_varint_,false->"varint"|Ot.Pk_bits32,false->"bits32"|Ot.Pk_bits64,false->"bits64"|Ot.Pk_bytes,_->"bytes"|Ot.Pk_varint_,true|Ot.Pk_bits32,true|Ot.Pk_bits64,true->"bytes"inmatchcapitalizewith|None->s|Some()->String.capitalize_asciis(* this function transforms a `lower_case_like_this` into an
* ocamlCaseLikeThis *)letcamel_case_of_labels=letlen=String.lengthsinletb=Bytes.createleninletcapitalize=reffalseandblen=ref0infori=0tolen-1doletc=String.getsiinifc='_'thencapitalize:=trueelse(if!capitalizethenBytes.setb!blen(Char.uppercase_asciic)elseBytes.setb!blenc;capitalize:=false;incrblen)done;Bytes.sub_stringb0!blenletcamel_case_of_constructors=camel_case_of_label(String.lowercase_asciis)letcollect_modules_of_field_typemodules=function|Ot.Ft_user_defined_type{Ot.udt_module_prefix=Somem;_}->m::modules|_->modulesletcollect_modules_of_variantmodules{Ot.v_constructors;_}=List.fold_left(funmodules{Ot.vc_field_type;_}->matchvc_field_typewith|Ot.Vct_nullary->modules|Ot.Vct_non_nullary_constructorfield_type->collect_modules_of_field_typemodulesfield_type)modulesv_constructorsletcollect_modules_of_record_field_typemodules=function|Ot.Rft_nolabel(field_type,_,_)|Ot.Rft_required(field_type,_,_,_)|Ot.Rft_optional(field_type,_,_,_)|Ot.Rft_repeated(_,field_type,_,_,_)|Ot.Rft_associative(_,_,_,(field_type,_))->collect_modules_of_field_typemodulesfield_type|Ot.Rft_variantvariant->collect_modules_of_variantmodulesvariantletcollect_modules_of_recordmodules{Ot.r_fields;_}=List.fold_left(funmodules{Ot.rf_field_type;_}->collect_modules_of_record_field_typemodulesrf_field_type)modulesr_fieldsletcollect_modules_of_type_specmodules=function|Ot.Recordr->collect_modules_of_recordmodulesr|Ot.Variantv->collect_modules_of_variantmodulesv|Ot.Const_variant_->modules|Ot.Unit_->modulesletcollect_modules_of_typesocaml_types=List.fold_left(funmodules{Ot.spec;_}->collect_modules_of_type_specmodulesspec)[]ocaml_types|>List.sort_uniqStdlib.compare(*let module_of_context module_prefix file_suffix = function
| `Single_file -> ""
| `Multi_file -> Printf.sprintf "%s_%s." module_prefix file_suffix *)