Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file utils.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414openPpxlibopenAst_builder.Defaultletverbose=matchSys.getenv_opt"PPX_ENCODING_DEBUG"with|None|Some"0"|Some"false"|Some"no"->0|Somes->matchswith|"true"->1|s->matchint_of_string_optswith|Somei->i|None->0letfake=matchSys.getenv_opt"PPX_ENCODING_FAKE"with|Some"1"|Some"true"|Some"yes"->true|_->falseletdebug?(v=1)?(force=false)fmt=ifforce||verbose>=vthenFormat.ksprintf(funs->Format.eprintf"%s@."s)fmtelsePrintf.ifprintf()fmtletjson_encoding_dot=ref"Json_encoding."letjson_encoding_tmp=ref!json_encoding_dotletwrap=function|None->json_encoding_tmp:=!json_encoding_dot|Some""->json_encoding_tmp:=!json_encoding_dot;json_encoding_dot:=""|Somes->json_encoding_tmp:=!json_encoding_dot;json_encoding_dot:=String.capitalize_asciis^"."letunwrap()=json_encoding_dot:=!json_encoding_tmplet()=wrap(Sys.getenv_opt"PPX_ENCODING_MODULE")letraise_error~locs=Location.raise_errorf~locsletenc_names:(string,string)Hashtbl.t=Hashtbl.create256letenc_name?(search=true)type_name=letauxname=matchList.rev@@String.split_on_char'.'namewith|[]->assertfalse|"t"::q->String.concat"."@@List.rev@@"enc"::q|_->name^"_enc"inifnotsearchthenauxtype_nameelsematchHashtbl.find_optenc_namestype_namewith|None->auxtype_name|Somename->nameletadd_enc_nametype_nameenc_name=Hashtbl.addenc_namestype_nameenc_nameletenc_mods=!json_encoding_dot^sletenc_var~locs=evar~loc(enc_mods)letenc_apply~locsl=eapply~loc(enc_var~locs)lletpexp_funpe=pexp_fun~loc:e.pexp_locNolabelNonepeletllid~locs={txt=Longident.parses;loc}letesomee=letloc=e.pexp_locinpexp_construct~loc(llid~loc"Some")(Somee)letenone~loc=pexp_construct~loc(llid~loc"None")Noneleteoption~loc=function|None->enone~loc|Somee->esomeeletconv1~locconstructdestructenc=enc_apply~loc"conv"[pexp_fun(pvar~loc"x")(construct(evar~loc"x"));pexp_fun(pvar~loc"x")(destruct(evar~loc"x"));enc]letrecadd_params_funexpr=function|[]->expr|{ptyp_desc=Ptyp_varx;ptyp_loc=loc;_}::t->pexp_fun(ppat_constraint~loc(pvar~loc("_"^enc_namex))(ptyp_constr~loc(llid~loc(enc_mod"encoding"))[ptyp_var~locx]))(add_params_funexprt)|_::t->add_params_funexprtletrecadd_params_fun_sigtyp=function|[]->typ|{ptyp_desc=Ptyp_varx;ptyp_loc=loc;_}::t->ptyp_arrow~locNolabel(ptyp_constr~loc(llid~loc(enc_mod"encoding"))[ptyp_var~locx])(add_params_fun_sigtypt)|_::t->add_params_fun_sigtyptletparam_namesparams=List.rev@@List.fold_left(funacc(p,_)->matchp.ptyp_descwith|Ptyp_varx->x::acc|_->acc)[]paramsletstring_literal=function|Ppxlib.Pconst_string(s,_,_)->Somes|_->Noneletget_expr_attr=function|PStr[{pstr_desc=Pstr_eval(e,_);_}]->Somee|_->Noneletget_string_attr=function|PStr[{pstr_desc=Pstr_eval({pexp_desc=Pexp_constantcst;_},_);_}]->string_literalcst|_->Noneletrm_prefix_of_expre=matche.pexp_descwith|Pexp_construct({txt=Lident"true";_},_)->Some(`booltrue)|Pexp_construct({txt=Lident"false";_},_)->Some(`boolfalse)|Pexp_constant(Pconst_integer(s,None))->Some(`length(int_of_strings))|Pexp_constantcst->beginmatchstring_literalcstwith|Somes->Some(`prefixs)|None->Noneend|_->Noneletget_rm_prefix_attrpl=matchget_expr_attrplwith|None->None|Somee->rm_prefix_of_expreletcamel_to_snakes=letn=String.lengthsinletb=Bytes.create(2*n)inletrecauxij=ifi=nthenjelseletc=String.getsiinletcode=Char.codecinifcode>=65&&code<=90then(Bytes.setbj'_';Bytes.setb(j+1)(Char.chr(code+32));aux(i+1)(j+2))else(Bytes.setbjc;aux(i+1)(j+1))inletm=aux00inBytes.(to_string@@subb0m)letsnake_to_camels=letn=String.lengthsinletb=Bytes.createninletrecauxij=ifi=nthenjelseletc=String.getsiinifc='_'&&i<>(n-1)then(letc=String.gets(i+1)inBytes.setbjChar.(chr@@(codec)-32);aux(i+2)(j+1))else(Bytes.setbjc;aux(i+1)(j+1))inletm=aux00inBytes.(to_string@@subb0m)typefield_attributes={fa_field:string*bool*expressionoption;fa_key:string;fa_title:expressionoption;fa_description:expressionoption;fa_assoc:booloption;fa_enum:booloption;fa_exclude:expressionoption;fa_obj:booloption;fa_enc:expressionoption;fa_obj1:stringoption;fa_merge:bool;fa_construct_default:bool;fa_set:expressionoption;fa_map:expressionoptionoption;}letfield_attrs~key?(opt=false)?(option="opt")?(camel=false)?(snake=false)?set?mapl=letfa_field=matchopt,optionwith|false,_->("req",false,None)|_,"opt"->("opt",true,None)|_,"req"->("req",false,None)|_->("dft",false,Some(enone~loc:!Ast_helper.default_loc))inletfa_key=ifcamelthensnake_to_camelkeyelseifsnakethencamel_to_snakekeyelsekeyinList.fold_left(funfaa->matcha.attr_name.txtwith|"req"|"enc.req"->{fawithfa_field=("req",false,None)}|"opt"|"enc.opt"->{fawithfa_field=("opt",true,None)}|"dft"|"enc.dft"->{fawithfa_field=("dft",false,get_expr_attra.attr_payload)}|"ddft"|"enc.ddft"->{fawithfa_field=("dft",false,get_expr_attra.attr_payload);fa_construct_default=true}|"key"|"enc.key"->beginmatchget_string_attra.attr_payloadwith|None->failwith"key expression must be a string constant"|Somefa_key->{fawithfa_key}end|"title"|"enc.title"->{fawithfa_title=get_expr_attra.attr_payload}|"description"|"enc.description"->{fawithfa_description=get_expr_attra.attr_payload}|"assoc"|"enc.assoc"->{fawithfa_assoc=Sometrue}|"enum"|"enc.enum"->{fawithfa_enum=Sometrue}|"exclude"|"enc.exclude"->{fawithfa_exclude=get_expr_attra.attr_payload}|"object"|"enc.object"->{fawithfa_obj=Sometrue}|"encoding"|"enc.encoding"->{fawithfa_enc=get_expr_attra.attr_payload}|"obj1"|"enc.obj1"|"wrap"|"enc.wrap"->{fawithfa_obj1=get_string_attra.attr_payload}|"merge"|"enc.merge"->{fawithfa_merge=true}|"camel"|"enc.camel"->{fawithfa_key=snake_to_camelfa.fa_key}|"snake"|"enc.snake"->{fawithfa_key=camel_to_snakefa.fa_key}|"set"|"enc.set"->{fawithfa_set=get_expr_attra.attr_payload}|"map"|"enc.map"->{fawithfa_map=Some(get_expr_attra.attr_payload)}|_->fa){fa_field;fa_key;fa_title=None;fa_description=None;fa_assoc=None;fa_enum=None;fa_exclude=None;fa_obj=None;fa_enc=None;fa_obj1=None;fa_merge=false;fa_construct_default=false;fa_set=set;fa_map=map}ltypecs_attributes={cs_kind:stringoption;cs_kind_label:stringoption;cs_assoc:booloption;cs_enum:booloption;cs_key:stringoption;cs_obj:booloption;cs_enc:expressionoption;cs_title:expressionoption;cs_description:expressionoption;cs_ignore:bool;cs_rm_prefix:[`boolofbool|`prefixofstring|`lengthofint];cs_obj1:stringoption;cs_empty:booloption;}letconstructor_attrsl=List.fold_left(funcsa->matcha.attr_name.txtwith|"kind"|"enc.kind"->letcs_kind=matchget_string_attra.attr_payloadwith|None->Some""|k->kin{cswithcs_kind}|"kind_label"|"enc.kind_label"->{cswithcs_kind_label=get_string_attra.attr_payload}|"assoc"|"enc.assoc"->{cswithcs_assoc=Sometrue}|"enum"|"enc.enum"->{cswithcs_enum=Sometrue}|"key"|"enc.key"->{cswithcs_key=get_string_attra.attr_payload}|"object"|"enc.object"->{cswithcs_obj=Sometrue}|"encoding"|"enc.encoding"->{cswithcs_enc=get_expr_attra.attr_payload}|"title"|"enc.title"->{cswithcs_title=get_expr_attra.attr_payload}|"description"|"enc.desccription"->{cswithcs_description=get_expr_attra.attr_payload}|"ignore"|"enc.ignore"->{cswithcs_ignore=true}|"remove_prefix"|"enc.remove_prefix"->letcs_rm_prefix=matchget_rm_prefix_attra.attr_payloadwith|None->`booltrue|Somex->xin{cswithcs_rm_prefix}|"obj1"|"enc.obj1"|"wrap"|"enc.wrap"->{cswithcs_obj1=get_string_attra.attr_payload}|"empty"|"enc.empty"->{cswithcs_empty=Sometrue}|_->cs){cs_kind=None;cs_assoc=None;cs_enum=None;cs_key=None;cs_obj=None;cs_enc=None;cs_title=None;cs_description=None;cs_ignore=false;cs_rm_prefix=`boolfalse;cs_obj1=None;cs_kind_label=None;cs_empty=None}ltypecore_attributes={co_assoc:booloption;co_enum:booloption;co_exclude:expressionoption;co_obj:booloption;co_enc:expressionoption;co_obj1:stringoption;co_merge:bool;co_rm_prefix:[`boolofbool|`prefixofstring|`lengthofint]option;co_set:expressionoption;co_map:expressionoptionoption;}letcore_attrs?assoc?enum?obj?enc?obj1?set?mapl=List.fold_left(funcoa->matcha.attr_name.txtwith|"assoc"|"enc.assoc"->{cowithco_assoc=Sometrue}|"enum"|"enc.enum"->{cowithco_enum=Sometrue}|"exclude"|"enc.exclude"->{cowithco_exclude=get_expr_attra.attr_payload}|"object"|"enc.object"->{cowithco_obj=Sometrue}|"encoding"|"enc.encoding"->{cowithco_enc=get_expr_attra.attr_payload}|"obj1"|"enc.obj1"|"wrap"|"enc.wrap"->{cowithco_obj1=get_string_attra.attr_payload}|"merge"|"enc.merge"->{cowithco_merge=true}|"remove_prefix"|"enc.remove_prefix"->{cowithco_rm_prefix=get_rm_prefix_attra.attr_payload}|"set"->{cowithco_set=get_expr_attra.attr_payload}|"map"->{cowithco_map=Some(get_expr_attra.attr_payload)}|_->co){co_assoc=assoc;co_enum=enum;co_exclude=None;co_obj=obj;co_enc=enc;co_obj1=obj1;co_merge=false;co_rm_prefix=None;co_set=set;co_map=map}lletnew_var=leti=ref(-1)infun()->incri;"v"^string_of_int!iletstr_of_structuree=Pprintast.string_of_structureeletstr_of_signaturee=Pprintast.signatureFormat.str_formattere;Format.flush_str_formatter()letstr_of_coree=Pprintast.core_typeFormat.str_formattere;Format.flush_str_formatter()letrecencaps_tuple~locvartuple=function|[]->assertfalse|[h]->var~loch|h::t->tuple~loc[var~loch;encaps_tuple~locvartuplet]letrecencaps_merge~loc?(f="merge_objs")=function|[]->assertfalse|[h,merge]->ifmergethenhelseenc_apply~loc"obj1"[h]|[f1,m1;f2,m2]whennotm1&¬m2->enc_apply~loc"obj2"[f1;f2]|(h,merge)::t->enc_apply~locf[ifmergethenhelseenc_apply~loc"obj1"[h];encaps_merge~loc~ft]letobj_expr~loc?(kind="obj")l=letv=List.mapi(funi_->"x"^string_of_inti)linletno_merge=List.for_all(fun(_,b)->notb)linletn=List.lengthlinifn<11&&no_mergetheneapply~loc(evar~loc(enc_mod(kind^string_of_intn)))(List.mapfstl)elseletf="merge_"^kind^"s"inenc_apply~loc"conv"[pexp_fun(ppat_tuple~loc(List.map(pvar~loc)v))(encaps_tuple~locevarpexp_tuplev);pexp_fun(encaps_tuple~locpvarppat_tuplev)(pexp_tuple~loc(List.map(evar~loc)v));encaps_merge~loc~fl]letremove_prefixsn=String.subsn(String.lengths-n)letsame_prefixl=letcommon_prefixs1s2=letn1=String.lengths1inletn2=String.lengths2inletrecauxi=ifi<n1&&i<n2&&s1.[i]=s2.[i]thenaux(i+1)elsei,String.subs10iinaux0inletrecauxnpr=function|[]->n,pr|h::t->letn,pr=common_prefixhprinauxnprtinmatchlwith|[]|[_]->0|h::t->fst(aux(String.lengthh)ht)moduletypeS=sigtype'aencodingtype'afieldtype'acasevalunit:unitencodingvalempty:unitencodingvalint:intencodingvalint32:int32encodingvalint53:int64encodingvalbool:boolencodingvalstring:stringencodingvalstring_enum:(string*'a)list->'aencodingvalconstant:string->unitencodingvalbytes:bytesencodingvalfloat:floatencodingvaloption:'aencoding->'aoptionencodingvalreq:?title:string->?description:string->string->'tencoding->'tfieldvalopt:?title:string->?description:string->string->'tencoding->'toptionfieldvaldft:?title:string->?description:string->string->'tencoding->'t->'tfieldvalobj1:'f1field->'f1encodingvalobj2:'f1field->'f2field->('f1*'f2)encodingvalobj3:'f1field->'f2field->'f3field->('f1*'f2*'f3)encodingvalobj4:'f1field->'f2field->'f3field->'f4field->('f1*'f2*'f3*'f4)encodingvalobj5:'f1field->'f2field->'f3field->'f4field->'f5field->('f1*'f2*'f3*'f4*'f5)encodingvalobj6:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->('f1*'f2*'f3*'f4*'f5*'f6)encodingvalobj7:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->('f1*'f2*'f3*'f4*'f5*'f6*'f7)encodingvalobj8:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8)encodingvalobj9:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->'f9field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8*'f9)encodingvalobj10:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->'f9field->'f10field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8*'f9*'f10)encodingvalmerge_objs:'aencoding->'bencoding->('a*'b)encodingvaltup1:'f1field->'f1encodingvaltup2:'f1field->'f2field->('f1*'f2)encodingvaltup3:'f1field->'f2field->'f3field->('f1*'f2*'f3)encodingvaltup4:'f1field->'f2field->'f3field->'f4field->('f1*'f2*'f3*'f4)encodingvaltup5:'f1field->'f2field->'f3field->'f4field->'f5field->('f1*'f2*'f3*'f4*'f5)encodingvaltup6:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->('f1*'f2*'f3*'f4*'f5*'f6)encodingvaltup7:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->('f1*'f2*'f3*'f4*'f5*'f6*'f7)encodingvaltup8:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8)encodingvaltup9:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->'f9field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8*'f9)encodingvaltup10:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->'f9field->'f10field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8*'f9*'f10)encodingvalmerge_tups:'aencoding->'bencoding->('a*'b)encodingvalarray:'aencoding->'aarrayencodingvallist:'aencoding->'alistencodingvalassoc:'aencoding->(string*'a)listencodingvalcase:?title:string->?description:string->('tencoding->('a->'toption)->('t->'a))list->'acasevalunion:'acaselist->'aencodingvalconv:('a->'b)->('b->'a)->'bencoding->'aencodingvalmu:string->?title:string->?description:string->('aencoding->'aencoding)->'aencodingvalany_ezjson_value:'aencodingvaldef:string->?title:string->?description:string->'aencoding->'aencodingend