123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145typeid=inttypecall={id:id;method_:string;params:Yojson.Safe.t}typecancel={id:id}typeincoming=|Callofcall|Cancelofcanceltypeok={id:id;result:Yojson.Safe.t}typeerr={id:idoption;error:Error.t}typeevent={id:id;event:Yojson.Safe.t}typeoutgoing=|Out_okofok|Out_erroferr|Out_eventofeventletassoc=function|`Assocfields->Okfields|_->Error"frame must be an object"letint_of_yojsonname=function|`Intvalue->Okvalue|`Intlitvalue->(tryOk(int_of_stringvalue)withFailure_->Error(name^" must be an integer"))|_->Error(name^" must be an integer")letid_of_yojsonvalue=int_of_yojson"id"valueletid_opt_of_yojson=function|`Null->OkNone|value->(matchid_of_yojsonvaluewith|Okid->Ok(Someid)|Errormessage->Errormessage)letstring_of_yojsonname=function|`Stringvalue->Okvalue|_->Error(name^" must be a string")letfieldnamefields=matchList.assoc_optnamefieldswith|Somevalue->Okvalue|None->Error("missing field: "^name)letoptional_idjson=matchjsonwith|`Assocfields->(matchList.assoc_opt"id"fieldswith|None|Some`Null->None|Somevalue->Result.to_option(id_of_yojsonvalue))|_->Noneletincoming_to_yojson=function|Call{id;method_;params}->`Assoc["kind",`String"call";"id",`Intid;"method",`Stringmethod_;"params",params]|Cancel{id}->`Assoc["kind",`String"cancel";"id",`Intid]letincoming_of_yojsonjson=matchassocjsonwith|Errormessage->Errormessage|Okfields->(matchfield"kind"fieldswith|Errormessage->Errormessage|Ok(`String"call")->(matchfield"id"fields,field"method"fields,field"params"fieldswith|Okid_json,Okmethod_json,Okparams->(matchid_of_yojsonid_json,string_of_yojson"method"method_jsonwith|Okid,Okmethod_->Ok(Call{id;method_;params})|Errormessage,_|_,Errormessage->Errormessage)|Errormessage,_,_|_,Errormessage,_|_,_,Errormessage->Errormessage)|Ok(`String"cancel")->(matchfield"id"fieldswith|Errormessage->Errormessage|Okid_json->(matchid_of_yojsonid_jsonwith|Okid->Ok(Cancel{id})|Errormessage->Errormessage))|Ok(`Stringkind)->Error("unknown incoming frame kind: "^kind)|Ok_->Error"kind must be a string")letoutgoing_to_yojson=function|Out_ok{id;result}->`Assoc["kind",`String"ok";"id",`Intid;"result",result]|Out_err{id;error}->`Assoc["kind",`String"err";"id",(matchidwithSomeid->`Intid|None->`Null);"error",Error.to_yojsonerror]|Out_event{id;event}->`Assoc["kind",`String"event";"id",`Intid;"event",event]letoutgoing_of_yojsonjson=matchassocjsonwith|Errormessage->Errormessage|Okfields->(matchfield"kind"fieldswith|Errormessage->Errormessage|Ok(`String"ok")->(matchfield"id"fields,field"result"fieldswith|Okid_json,Okresult->(matchid_of_yojsonid_jsonwith|Okid->Ok(Out_ok{id;result})|Errormessage->Errormessage)|Errormessage,_|_,Errormessage->Errormessage)|Ok(`String"err")->(matchfield"id"fields,field"error"fieldswith|Okid_json,Okerror_json->(matchid_opt_of_yojsonid_json,Error.of_yojsonerror_jsonwith|Okid,Okerror->Ok(Out_err{id;error})|Errormessage,_|_,Errormessage->Errormessage)|Errormessage,_|_,Errormessage->Errormessage)|Ok(`String"event")->(matchfield"id"fields,field"event"fieldswith|Okid_json,Okevent->(matchid_of_yojsonid_jsonwith|Okid->Ok(Out_event{id;event})|Errormessage->Errormessage)|Errormessage,_|_,Errormessage->Errormessage)|Ok(`Stringkind)->Error("unknown outgoing frame kind: "^kind)|Ok_->Error"kind must be a string")