123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990moduleOt=Pb_codegen_ocaml_typemoduleF=Pb_codegen_formattingopenPb_codegen_util(** Is this field optional enough that we give it a default value? *)letfield_is_optional(r_field:Ot.record_field):bool=matchr_field.rf_field_typewith|Rft_optional_->true|_->false(** Obtain information about the fields *)letfields_of_record{Ot.r_fields;_}:(string*string*[`Optionalof_|`Required])list=List.map(funr_field->letfname,fdefault,ftype=Pb_codegen_default.record_field_default_infor_fieldiniffield_is_optionalr_fieldthenfname,ftype,`Optionalfdefaultelsefname,ftype,`Required)r_fieldsletgen_record?and_({Ot.r_name;_}asr)sc:unit=letfields=fields_of_recordrinF.linepsc"%s make_%s "(let_decl_of_andand_)r_name;F.sub_scopesc(funsc->List.iter(fun(fname,ftype,d)->matchdwith|`Required->F.linepsc"~(%s:%s)"fnameftype|`Optionalfvalue->F.linepsc"?%s:((%s:%s) = %s)"fnamefnameftypefvalue)fields;F.linepsc"() : %s = {"r_name);F.sub_scopesc(funsc->List.iter(fun(fname,_,_)->F.linepsc"%s;"fname)fields);F.linesc"}"letgen_struct?and_tsc=let{Ot.spec;_}=tinlethas_encoded=matchspecwith|Ot.Recordr->gen_record?and_rsc;true|Ot.Const_variant_|Ot.Variant_|Ot.Unit_->(* nothing for variants *)falseinhas_encodedletgen_sig_recordsc({Ot.r_name;_}asr)=F.linepsc"val make_%s : "r_name;letfields:_list=fields_of_recordrinF.sub_scopesc(funsc->List.iter(fun(field_name,field_type,d)->matchdwith|`Optional_->F.linepsc"?%s:%s ->"field_namefield_type|`Required->F.linepsc"%s:%s ->"field_namefield_type)fields;F.linesc"unit ->";F.linescr_name);letrn=r_nameinF.linepsc"(** [make_%s … ()] is a builder for type [%s] *)"rnrnletgen_sig?and_:_tsc=let{Ot.spec;_}=tinlethas_encoded=matchspecwith|Ot.Recordr->gen_sig_recordscr;true|Ot.Variant_|Ot.Const_variant_|Ot.Unit_->falseinhas_encodedletocamldoc_title="Make functions"letrequires_mutable_records=false