rough idea is to parse+typecheck the RPC declarations, and generate client and server code.
server code for a service would be, basically:
type headers = (string * string) list
type handler = headers:headers -> string -> (string, string) result
type service = (string list * handler) list
a service is a collection of path + handler for the path; The handler reads headers to know what format to expect (json or protobuf) and returns an error or a successful encoded response body. All decoding/encoding is inside the handler, but the HTTP specifics are delegated to the user
client code might be functorized:
module My_service_client(H : Http_client_sig.S) = struct
let foo x y = H.get (encode_foo_query x y) |> decode_foo_response
let bar x = H.get (encode_bar_query x) |> decode_bar_response
…
so it can be instantiated with a variety of HTTP clients.
rough idea is to parse+typecheck the RPC declarations, and generate client and server code.
server code for a service would be, basically:
a service is a collection of path + handler for the path; The handler reads headers to know what format to expect (json or protobuf) and returns an error or a successful encoded response body. All decoding/encoding is inside the handler, but the HTTP specifics are delegated to the user
so it can be instantiated with a variety of HTTP clients.