Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file utils.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468openPpxlibopenAst_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|_->falseletremove_prefix_var=matchSys.getenv_opt"PPX_ENCODING_RM_PREFIX"with|Some"false"|Some"0"->false|_->trueletdebug?(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)lletenc_apply0~locsl=pexp_apply~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)leteoption~loc=function|None->[%exprNone]|Somee->esomeeletrecadd_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_expreletto_snake?(sep='_')s=letn=String.lengthsinletb=Bytes.create(2*n)inletrecauxij=ifi=nthenjelseletc=String.getsiinletcode=Char.codecinifi=0&&code>=65&&code<=90then(Bytes.setbj(Char.chr(code+32));aux(i+1)(j+1))elseifcode>=65&&code<=90then(Bytes.setbjsep;Bytes.setb(j+1)(Char.chr(code+32));aux(i+1)(j+2))elseifc='-'||c='_'then(Bytes.setbjsep;aux(i+1)(j+1))else(Bytes.setbjc;aux(i+1)(j+1))inletm=aux00inBytes.(to_string@@subb0m)letto_camel?(pascal=false)s=letn=String.lengthsinletb=Bytes.createninletrecauxij=ifi=nthenjelseletc=String.getsiinif(c='_'||c='-')&&i<>(n-1)then(letcode=Char.code@@String.gets(i+1)inletc=ifcode>=97&&code<=122thenChar.chr(code-32)elseChar.chrcodeinBytes.setbjc;aux(i+2)(j+1))else(Bytes.setbjc;aux(i+1)(j+1))inletm=aux00inlets=Bytes.(to_string@@subb0m)inifpascalthenString.capitalize_asciiselsestypefield_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;}lettransform_case?case?(typ=`cons)s=matchcasewith|None->beginmatchtypwith`cons->String.uncapitalize_asciis|`variant->send|Some`camel->to_camels|Some`snake->to_snakes|Some`pascal->to_camel~pascal:trues|Some`kebab->to_snake~sep:'-'s|Some`upper->String.uppercase_asciis|Some`cap->String.capitalize_asciisletfield_attrs~key?(opt=false)?(option="opt")?case?set?mapl=letfa_field=matchopt,optionwith|false,_->("req",false,None)|_,"opt"->("opt",true,None)|_,"req"->("req",false,None)|_->letloc=!Ast_helper.default_locin("dft",false,Some[%exprNone])inletfa_key=transform_case?casekeyinList.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}|"union"|"enc.union"->{fawithfa_enum=Somefalse}|"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=to_camelfa.fa_key}|"snake"|"enc.snake"->{fawithfa_key=to_snakefa.fa_key}|"pascal"|"enc.pascal"->{fawithfa_key=to_camel~pascal:truefa.fa_key}|"kebab"|"enc.kebab"->{fawithfa_key=to_snake~sep:'-'fa.fa_key}|"set"|"enc.set"->{fawithfa_set=get_expr_attra.attr_payload}|"map"|"enc.map"->{fawithfa_map=Some(get_expr_attra.attr_payload)}|"upper"|"enc.upper"->{fawithfa_key=String.uppercase_asciifa.fa_key}|"cap"|"enc.cap"->{fawithfa_key=String.capitalize_asciifa.fa_key}|_->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}lletpp_expression=Pprintast.expressiontypecs_attributes={cs_kind:stringoption;cs_kind_label:stringoption;cs_assoc:booloption;cs_enum:booloption;cs_transform:(string->string);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;cs_case:expressionoption;}letconstructor_attrs?case?typ?kindl=letcs_transforms=transform_case?case?typsinletcs_kind,cs_kind_label=matchkindwith|Some(Somek)->Some"",Somek|SomeNone->Some"",None|_->None,NoneinList.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}|"union"|"enc.union"->{cswithcs_enum=Somefalse}|"key"|"enc.key"->beginmatchget_string_attra.attr_payloadwith|None->failwith"key expression must be a string constant"|Somes->{cswithcs_transform=fun_->s}end|"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}|"camel"|"enc.camel"->{cswithcs_transform=to_camel}|"snake"|"enc.snake"->{cswithcs_transform=to_snake}|"pascal"|"enc.pascal"->{cswithcs_transform=to_camel~pascal:true}|"kebab"|"enc.kebab"->{cswithcs_transform=to_snake~sep:'-'}|"upper"|"enc.upper"->{cswithcs_transform=String.uppercase_ascii}|"cap"|"enc.cap"->{cswithcs_transform=String.capitalize_ascii}|"case"|"enc.case"->{cswithcs_case=get_expr_attra.attr_payload}|_->cs){cs_kind;cs_assoc=None;cs_enum=None;cs_transform;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;cs_empty=None;cs_case=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;co_opt: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}|"union"|"enc.union"->{cowithco_enum=Somefalse}|"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)}|"opt"->{cowithco_opt=SomeNone}|"dft"->{cowithco_opt=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;co_opt=None}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_prefixhprinauxnprtinletchecknl=List.for_all(funs->String.lengths>n)linmatchlwith|[]|[_]->0|h::t->letn=fst(aux(String.lengthh)ht)inifchecknlthennelse0letremove_prefix_optionsl=function|Some(`boolfalse)->0|Some(`lengthn)->n|Some(`prefixs)->String.lengths|_->ifnotremove_prefix_varthen0elsesame_prefixlmoduletypeS=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