123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172(* Json adapters. See .mli. *)moduletypeS=sigvalnormalize:Yojson.Safe.t->Yojson.Safe.tvalrestore:Yojson.Safe.t->Yojson.Safe.tendmoduleType_field=structmoduletypeParam=sigvaltype_field_name:stringendmoduleMake(Param:Param):S=structopenYojson.SafeopenParamletnormalize(x:t):t=matchxwith|`Assocfields->(matchList.assoctype_field_namefieldswith|`Stringtype_->`List[`Stringtype_;x]|exceptionNot_found->x|_->x(* malformed *))|`Stringtype_asx->x|malformed->malformedletrestore(x:t):t=matchxwith|`List[`Stringtype_;`Assocfields]->letfields=(type_field_name,`Stringtype_)::List.filter(fun(k,v)->k<>type_field_name)fieldsin`Assocfields|`Stringtype_asx->x|malformed->malformedendmoduleDefault_param:Param=structlettype_field_name="type"endincludeMake(Default_param)endmoduleOne_field=structopenYojson.Safeletnormalize(x:t):t=matchxwith|`Assoc[name,value]->`List[`Stringname;value]|`String_asx->x|malformed->malformedletrestore(x:t):t=matchxwith|`List[`Stringname;value]->`Assoc[name,value]|`String_asx->x|malformed->malformedendmoduleType_and_value_fields=structmoduletypeParam=sigvaltype_field_name:stringvalvalue_field_name:stringvalknown_tags:(stringlist*string)optionendmoduleMake(Param:Param):S=structopenYojson.SafeopenParamletis_known_tag=matchknown_tagswith|None->(fun_->true)|Some(l,_)->lettbl=Hashtbl.create(2*List.lengthl)inList.iter(funx->Hashtbl.addtblx())l;Hashtbl.memtblletis_catch_all_tag=matchknown_tagswith|None->(fun_->false)|Some(_,s)->((=)s)letcatch_all_tag()=matchknown_tagswith|None->assertfalse|Some(_,s)->sletwrap_varianttype_value=letvariant=`List[`Stringtype_;value]inifis_known_tagtype_thenvariantelse`List[`String(catch_all_tag());variant]letwrap_enumtype_=ifis_known_tagtype_then`Stringtype_else`List[`String(catch_all_tag());`Null]letnormalize(x:t):t=letopenYojson.Safe.Utilinmatchxwith|`Assocfields->lettype_=membertype_field_namex|>to_stringinletfound=reffalseinletfields=List.map(fun((k,v)asfield)->ifk=value_field_namethen(found:=true;(k,wrap_varianttype_v))elsefield)fieldsinletfields=if!foundthenfieldselse(value_field_name,wrap_enumtype_)::fieldsin`Assocfields|malformed->malformedletunwrap_value(x:t)=matchxwith|`Stringtag->(tag,None)|`List[`Stringtag;v]->ifis_catch_all_tagtagthen(matchvwith|`List[`Stringreal_tag;`Null]->(real_tag,None)|`List[`Stringreal_tag;real_v]->(real_tag,Somereal_v)|_->failwith("Malformed json field "^value_field_name))else(tag,Somev)|malformed->failwith("Malformed json field "^value_field_name)letrestore(x:t):t=matchxwith|`Assocfields->lettype_=refNoneinletfields=List.fold_right(fun((k,tagged)asfield)acc->ifk=value_field_namethen(lettag,opt_value=unwrap_valuetaggedintype_:=Sometag;matchopt_valuewith|None->acc|Somev->(value_field_name,v)::acc)elseifk=type_field_namethenaccelsefield::acc)fields[]inletfields=match!type_with|None->fields|Sometag->(type_field_name,`Stringtag)::fieldsin`Assocfields|malformed->malformedendend