123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222moduleOt=Pb_codegen_ocaml_typemoduleF=Pb_codegen_formattingmoduleE=Pb_exceptionopenPb_codegen_utilletdefault_value_of_basic_type?field_namebasic_typefield_default=matchbasic_type,field_defaultwith|Ot.Bt_string,None->"\"\""|Ot.Bt_string,Some(Pb_option.Constant_strings)->sp"\"%s\""s|Ot.Bt_float,None->"0."|Ot.Bt_float,Some(Pb_option.Constant_floatf)->string_of_floatf|Ot.Bt_int,None->"0"|Ot.Bt_int,Some(Pb_option.Constant_inti)->string_of_inti|Ot.Bt_int32,None->"0l"|Ot.Bt_int32,Some(Pb_option.Constant_inti)->sp"%il"i|Ot.Bt_uint32,None->"(`unsigned 0l)"|Ot.Bt_uint32,Some(Pb_option.Constant_inti)->sp"(`unsigned %il)"i|Ot.Bt_int64,None->"0L"|Ot.Bt_int64,Some(Pb_option.Constant_inti)->sp"%iL"i|Ot.Bt_uint64,None->"(`unsigned 0L)"|Ot.Bt_uint64,Some(Pb_option.Constant_inti)->sp"(`unsigned %iL)"i|Ot.Bt_bytes,None->"Bytes.create 0"|Ot.Bt_bytes,Some(Pb_option.Constant_strings)->sp"Bytes.of_string \"%s\""s|Ot.Bt_bool,None->"false"|Ot.Bt_bool,Some(Pb_option.Constant_boolb)->string_of_boolb|_->E.invalid_default_value?field_name~info:"invalid default type"()(* Generate the string which is the default value for a given field
type and default information. *)letdefault_value_of_field_type?field_namefield_typefield_default=matchfield_typewith|Ot.Ft_user_defined_typeudt->letfunction_prefix="default"infunction_name_of_user_defined~function_prefixudt^" ()"|Ot.Ft_unit->"()"|Ot.Ft_basic_typebt->default_value_of_basic_type?field_namebtfield_default|Ot.Ft_wrapper_type_->"None"(** This function returns [(field_name, field_default_value, field_type)] for
a record field. *)letrecord_field_default_inforecord_field=let{Ot.rf_label;Ot.rf_field_type;_}=record_fieldinlettype_string=Pb_codegen_util.string_of_record_field_typerf_field_typeinletfield_name=rf_labelinletdfvftfield_typefield_default=default_value_of_field_type~field_namefield_typefield_defaultinletdefault_value=matchrf_field_typewith|Ot.Rft_nolabel(field_type,_,_)->dfvftfield_typeNone|Ot.Rft_required(field_type,_,_,default_value)->dfvftfield_typedefault_value|Ot.Rft_optional(field_type,_,_,default_value)->(matchdefault_valuewith|None->"None"|Some_->sp"Some (%s)"@@dfvftfield_typedefault_value)|Ot.Rft_repeated(rt,field_type,_,_,_)->(matchrtwith|Ot.Rt_list->"[]"|Ot.Rt_repeated_field->sp"Pbrt.Repeated_field.make (%s)"(dfvftfield_typeNone))|Ot.Rft_associative(at,_,_,_)->(matchatwith|Ot.At_list->"[]"|Ot.At_hashtable->"Hashtbl.create 128")(* TODO This initial value could be configurable either via
* the default function or via a protobuf option. *)|Ot.Rft_variant{Ot.v_constructors;_}->(matchv_constructorswith|[]->assertfalse|{Ot.vc_constructor;vc_field_type;_}::_->(matchvc_field_typewith|Ot.Vct_nullary->vc_constructor|Ot.Vct_non_nullary_constructorfield_type->sp"%s (%s)"vc_constructor(dfvftfield_typeNone)))infield_name,default_value,type_stringletgen_record_mutable{Ot.r_name;r_fields}sc:unit=letfields_default_info=List.map(funr_field->record_field_default_infor_field)r_fieldsinletrn=Pb_codegen_util.mutable_record_namer_nameinF.linepsc"let default_%s () : %s = {"rnrn;F.sub_scopesc(funsc->List.iter(fun(fname,fvalue,_)->F.linepsc"%s = %s;"fnamefvalue)fields_default_info);F.linesc"}"letgen_record?and_{Ot.r_name;r_fields}sc:unit=letfields_default_info=List.map(funr_field->record_field_default_infor_field)r_fieldsinF.linepsc"%s default_%s "(let_decl_of_andand_)r_name;F.sub_scopesc(funsc->List.iter(fun(fname,fvalue,ftype)->F.linepsc"?%s:((%s:%s) = %s)"fnamefnameftypefvalue)fields_default_info;F.linepsc"() : %s = {"r_name);F.sub_scopesc(funsc->List.iter(fun(fname,_,_)->F.linepsc"%s;"fname)fields_default_info);F.linesc"}"letgen_unit?and_{Ot.er_name}sc=F.linepsc"%s default_%s = ()"(let_decl_of_andand_)er_nameletgen_variant?and_{Ot.v_name;Ot.v_constructors}sc=matchv_constructorswith|[]->failwith"programmatic TODO error"|{Ot.vc_constructor;vc_field_type;_}::_->letdecl=let_decl_of_andand_in(matchvc_field_typewith|Ot.Vct_nullary->F.linepsc"%s default_%s (): %s = %s"declv_namev_namevc_constructor|Ot.Vct_non_nullary_constructorfield_type->letdefault_value=letfield_name=v_nameindefault_value_of_field_type~field_namefield_typeNonein(* TODO need to fix the deault value *)F.linepsc"%s default_%s () : %s = %s (%s)"declv_namev_namevc_constructordefault_value)letgen_const_variant?and_{Ot.cv_name;Ot.cv_constructors}sc=letfirst_constructor_name=matchcv_constructorswith|[]->failwith"programmatic TODO error"|{Ot.cvc_name;_}::_->cvc_nameinF.linepsc"%s default_%s () = (%s:%s)"(let_decl_of_andand_)cv_namefirst_constructor_namecv_nameletgen_struct_full~with_mutable_records?and_tsc=let{Ot.spec;_}=tinlethas_encoded=matchspecwith|Ot.Recordr->gen_record?and_rsc;ifwith_mutable_recordsthengen_record_mutablersc;true|Ot.Variantv->gen_variant?and_vsc;true|Ot.Const_variantv->gen_const_variantvsc;true|Ot.Unitu->gen_unit?and_usc;trueinhas_encodedletgen_struct?and_tsc=gen_struct_full?and_~with_mutable_records:falsetscletgen_sig_recordsc{Ot.r_name;r_fields}=F.linepsc"val default_%s : "r_name;letfields_default_info:_list=List.map(funr_field->record_field_default_infor_field)r_fieldsinF.sub_scopesc(funsc->List.iter(fun(field_name,_,field_type)->F.linepsc"?%s:%s ->"field_namefield_type)fields_default_info;F.linesc"unit ->";F.linescr_name);letrn=r_nameinF.linepsc"(** [default_%s ()] is the default value for type [%s] *)"rnrnletgen_sig_unitsc{Ot.er_name}=F.linepsc"val default_%s : unit"er_name;letrn=er_nameinF.linepsc"(** [default_%s ()] is the default value for type [%s] *)"rnrnletgen_sig?and_:_tsc=letftype_name=F.linepsc"val default_%s : unit -> %s"type_nametype_name;F.linepsc"(** [default_%s ()] is the default value for type [%s] *)"type_nametype_nameinlet{Ot.spec;_}=tinlethas_encoded=matchspecwith|Ot.Recordr->gen_sig_recordscr;true|Ot.Variantv->fv.Ot.v_name;true|Ot.Const_variant{Ot.cv_name;_}->fcv_name;true|Ot.Unitu->gen_sig_unitscu;trueinhas_encodedletocamldoc_title="Basic values"letrequires_mutable_records=false