123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352openLangopenPetanque(* Serialization for agent types *)moduleLsp=Fleche_lspopenJAgent(* RPC-side server mappings, internal; we could split this in a different module
eventually as to make this clearer. *)moduleHType=structtype('p,'r)t=|Immediateof(token:Coq.Limits.Token.t->'p->('r,Error.t)Request.R.t)|FullDocof{uri_fn:'p->LUri.File.t;handler:token:Coq.Limits.Token.t->doc:Fleche.Doc.t->'p->('r,Error.t)Request.R.t}|PosInDocof{uri_fn:'p->LUri.File.t;pos_fn:'p->int*int;handler:token:Coq.Limits.Token.t->doc:Fleche.Doc.t->point:int*int->'p->('r,Error.t)Request.R.t}endmoduletypeHandler=sig(* Server-side RPC specification *)moduleParams:sigtypet[@@derivingof_yojson]end(* Server-side RPC specification *)moduleResponse:sigtypet[@@derivingto_yojson]endvalhandler:(Params.t,Response.t)HType.tend(* Note that here we follow JSON-RPC / LSP capitalization conventions *)moduleRequest=structmoduletypeS=sigvalmethod_:string(* Protocol params specification *)moduleParams:sigtypet[@@derivingyojson]end(* Protocol response specification *)moduleResponse:sigtypet[@@derivingyojson]endmoduleHandler:Handlerendend(* get_root_state RPC *)moduleGetRootState=structletmethod_="petanque/get_root_state"moduleParams=structtypet={opts:Run_opts.toption[@defaultNone];uri:Lsp.JLang.LUri.File.t}[@@derivingyojson]endmoduleResponse=structtypet=intRun_result.t[@@derivingyojson]endmoduleHandler=structmoduleParams=ParamsmoduleResponse=structtypet=State.tRun_result.t[@@derivingyojson]endlethandler=HType.FullDoc{uri_fn=(fun{Params.uri;_}->uri);handler=(fun~token:_~doc{opts;uri=_}->Agent.get_root_state?opts~doc())}endend(* get_state_at_pos RPC *)moduleGetStateAtPos=structletmethod_="petanque/get_state_at_pos"moduleParams=structtypet={uri:Lsp.JLang.LUri.File.t;opts:Run_opts.toption[@defaultNone];position:Lsp.JLang.Point.t}[@@derivingyojson]endmoduleResponse=structtypet=intRun_result.t[@@derivingyojson]endmoduleHandler=structmoduleParams=ParamsmoduleResponse=structtypet=State.tRun_result.t[@@derivingyojson]endlethandler=HType.PosInDoc{uri_fn=(fun{Params.uri;_}->uri);pos_fn=(fun{position;_}->(position.line,position.character));handler=(fun~token:_~doc~point{uri=_;opts;position=_}->Agent.get_state_at_pos?opts~doc~point())}endend(* start RPC *)moduleStart=structletmethod_="petanque/start"moduleParams=structtypet={uri:Lsp.JLang.LUri.File.t;opts:Run_opts.toption[@defaultNone];pre_commands:stringoption[@defaultNone];thm:string}[@@derivingyojson]endmoduleResponse=structtypet=intRun_result.t[@@derivingyojson]endmoduleHandler=structmoduleParams=ParamsmoduleResponse=structtypet=State.tRun_result.t[@@derivingyojson]endlethandler=HType.FullDoc{uri_fn=(fun{Params.uri;_}->uri);handler=(fun~token~doc{Params.uri=_;opts;pre_commands;thm}->Agent.start~token~doc?opts?pre_commands~thm())}endend(* run_tac RPC *)moduleRunTac=structletmethod_="petanque/run"moduleParams=structtypet={opts:Run_opts.toption[@defaultNone];st:int;tac:string}[@@derivingyojson]endmoduleResponse=structtypet=intRun_result.t[@@derivingyojson]endmoduleHandler=structmoduleParams=structtypet={opts:Run_opts.toption[@defaultNone](* Whether to memoize the execution *);st:State.t;tac:string}[@@derivingyojson]endmoduleResponse=structtypet=State.tRun_result.t[@@derivingyojson]endlethandler=HType.Immediate(fun~token{Params.opts;st;tac}->Agent.run~token?opts~st~tac())endend(* goals RPC *)moduleGoals=structletmethod_="petanque/goals"moduleParams=structtypet={st:int}[@@derivingyojson]endmoduleResponse=structtypet=Goals.t[@@derivingyojson]endmoduleHandler=structmoduleParams=structtypet={st:State.t}[@@derivingyojson]endmoduleResponse=Responselethandler=HType.Immediate(fun~token{Params.st}->Agent.goals~token~st)endend(* premises RPC *)modulePremises=structletmethod_="petanque/premises"moduleParams=structtypet={st:int}[@@derivingyojson]endmoduleResponse=structtypet=Premise.tlist[@@derivingyojson]endmoduleHandler=structmoduleParams=structtypet={st:State.t}[@@derivingyojson]endmoduleResponse=Responselethandler=HType.Immediate(fun~token{Params.st}->Agent.premises~token~st)endend(* StateEqual *)moduleStateEqual=structletmethod_="petanque/state/eq"moduleParams=structtypet={kind:Inspect.toption[@defaultNone];st1:int;st2:int}[@@derivingyojson]endmoduleResponse=structtypet=bool[@@derivingyojson]endmoduleHandler=structmoduleParams=structtypet={kind:Inspect.toption[@defaultNone];st1:State.t;st2:State.t}[@@derivingyojson]endmoduleResponse=Responselethandler=HType.Immediate(fun~token:_{Params.kind;st1;st2}->Ok(Agent.State.equal?kindst1st2))endendmoduleStateHash=structletmethod_="petanque/state/hash"moduleParams=structtypet={st:int}[@@derivingyojson]endmoduleResponse=structtypet=int[@@derivingyojson]endmoduleHandler=structmoduleParams=structtypet={st:State.t}[@@derivingyojson]endmoduleResponse=Responselethandler=HType.Immediate(fun~token:_{Params.st}->Ok(Agent.State.hashst))endendmoduleStateProofEqual=structletmethod_="petanque/state/proof/equal"moduleParams=StateEqual.ParamsmoduleResponse=StateEqual.ResponsemoduleHandler=structmoduleParams=StateEqual.Handler.ParamsmoduleResponse=Responselethandler=HType.Immediate(fun~token:_{Params.kind;st1;st2}->letpst1,pst2=Agent.State.(lemmasst1,lemmasst2)inOk(Option.equal(Agent.State.Proof.equal?kind)pst1pst2))endendmoduleStateProofHash=structletmethod_="petanque/state/proof/hash"moduleParams=StateHash.ParamsmoduleResponse=structtypet=intoption[@@derivingyojson]endmoduleHandler=structmoduleParams=StateHash.Handler.ParamsmoduleResponse=Responselethandler=HType.Immediate(fun~token:_{Params.st}->letpst=Agent.State.lemmasstinOk(Option.mapAgent.State.Proof.hashpst))endend