123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778open!Core_kernelincludeJson_object_intfmoduleUtils=structtypet=Json.tString.Map.t[@@derivingsexp,bin_io]letfield_map=identletof_json=Json.get_mapletto_jsont=`O(Map.to_alistt)letget_field=Map.findletget_field_exntfield=matchMap.findtfieldwith|Somevalue->value|None->raise_s[%message"Missing JSON field"(t:t)(field:string)];;letoptional_fieldnameconvertt=matchMap.findtnamewith|None|Some`Null->None|Somev->Some(convertv);;letrequired_fieldnameconvertt=convert(get_field_exntname)let(>>)fgx=g(fx)letor_nullfjson=matchjsonwith|`Null->None|json->Some(fjson);;letint=Json.get_intletfloat=Json.get_floatletbool=Json.get_boolletstring=Json.get_stringletusername=string>>Username.of_stringletsubreddit_name=string>>Subreddit_name.of_stringlettime=float>>Time_ns.Span.of_sec>>Time_ns.of_span_since_epochleturi=string>>Uri.of_stringendincludeUtilsmoduleMake_kinded(Param:Kinded_param)=structincludeParamletof_jsonjson=matchOption.try_with(fun()->Ezjsonm.findjson["kind"])with|None->Param.of_data_fieldjson|Some(`Stringkind)->(matchString.equalParam.kindkindwith|true->Param.of_data_field(Ezjsonm.findjson["data"])|false->raise_s[%message"Unexpected JSON object kind"~expected:(Param.kind:string)(json:Json.value)])|Somekind->raise_s[%message"JSON object kind is not a string"(kind:Json.value)(json:Json.value)];;letto_jsont=`O["kind",`StringParam.kind;"data",Param.to_data_fieldt]endmoduleMake_kinded_simple(Param:sigvalkind:stringend)=Make_kinded(structtypet=Utils.tletkind=Param.kindletof_data_field=of_jsonletto_data_field=to_jsonend)