mirror of
https://github.com/c-cube/linol.git
synced 2025-12-06 11:15:46 -05:00
add functions in jsonrpc2 to send queries/notifs directly from server
This commit is contained in:
parent
bb92d7d73b
commit
498c62d46f
3 changed files with 33 additions and 10 deletions
|
|
@ -9,18 +9,20 @@ module type S = sig
|
||||||
module IO : IO
|
module IO : IO
|
||||||
|
|
||||||
type t
|
type t
|
||||||
(** A jsonrpc2 connection. *)
|
|
||||||
|
|
||||||
include module type of Server.Make (IO)
|
include module type of Server.Make (IO)
|
||||||
|
|
||||||
val create : ic:IO.in_channel -> oc:IO.out_channel -> server -> t
|
val create : ic:IO.in_channel -> oc:IO.out_channel -> server -> t
|
||||||
(** Create a connection from the pair of channels *)
|
|
||||||
|
|
||||||
val create_stdio : server -> t
|
val create_stdio : server -> t
|
||||||
(** Create a connection using stdin/stdout *)
|
val send_server_notification : t -> Lsp.Server_notification.t -> unit IO.t
|
||||||
|
|
||||||
|
val send_server_request :
|
||||||
|
t ->
|
||||||
|
'from_server Lsp.Server_request.t ->
|
||||||
|
(('from_server, Jsonrpc.Response.Error.t) result -> unit IO.t) ->
|
||||||
|
Req_id.t IO.t
|
||||||
|
|
||||||
val run : ?shutdown:(unit -> bool) -> t -> unit IO.t
|
val run : ?shutdown:(unit -> bool) -> t -> unit IO.t
|
||||||
(** Listen for incoming messages and responses *)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module Make (IO : IO) : S with module IO = IO = struct
|
module Make (IO : IO) : S with module IO = IO = struct
|
||||||
|
|
@ -116,8 +118,8 @@ module Make (IO : IO) : S with module IO = IO = struct
|
||||||
(fun e -> IO.return (Error e))
|
(fun e -> IO.return (Error e))
|
||||||
|
|
||||||
(** Sends a server notification to the LSP client. *)
|
(** Sends a server notification to the LSP client. *)
|
||||||
let server_notification (self : t) (n : Lsp.Server_notification.t) : unit IO.t
|
let send_server_notification (self : t) (n : Lsp.Server_notification.t) :
|
||||||
=
|
unit IO.t =
|
||||||
let msg = Lsp.Server_notification.to_jsonrpc n in
|
let msg = Lsp.Server_notification.to_jsonrpc n in
|
||||||
send_server_notif self msg
|
send_server_notif self msg
|
||||||
|
|
||||||
|
|
@ -156,7 +158,8 @@ module Make (IO : IO) : S with module IO = IO = struct
|
||||||
match Lsp.Client_notification.of_jsonrpc n with
|
match Lsp.Client_notification.of_jsonrpc n with
|
||||||
| Ok n ->
|
| Ok n ->
|
||||||
with_error_handler self (fun () ->
|
with_error_handler self (fun () ->
|
||||||
self.s#on_notification n ~notify_back:(server_notification self)
|
self.s#on_notification n
|
||||||
|
~notify_back:(send_server_notification self)
|
||||||
~server_request:(server_request self))
|
~server_request:(server_request self))
|
||||||
| Error e -> IO.failwith (spf "cannot decode notification: %s" e)
|
| Error e -> IO.failwith (spf "cannot decode notification: %s" e)
|
||||||
|
|
||||||
|
|
@ -182,7 +185,8 @@ module Make (IO : IO) : S with module IO = IO = struct
|
||||||
| Ok (Lsp.Client_request.E r) ->
|
| Ok (Lsp.Client_request.E r) ->
|
||||||
protect ~id (fun () ->
|
protect ~id (fun () ->
|
||||||
let* reply =
|
let* reply =
|
||||||
self.s#on_request r ~id ~notify_back:(server_notification self)
|
self.s#on_request r ~id
|
||||||
|
~notify_back:(send_server_notification self)
|
||||||
~server_request:(server_request self)
|
~server_request:(server_request self)
|
||||||
in
|
in
|
||||||
let reply_json = Lsp.Client_request.yojson_of_result r reply in
|
let reply_json = Lsp.Client_request.yojson_of_result r reply in
|
||||||
|
|
@ -302,6 +306,11 @@ module Make (IO : IO) : S with module IO = IO = struct
|
||||||
IO.return
|
IO.return
|
||||||
@@ Error (E (ErrorCode.InvalidRequest, "content-type must be 'utf-8'"))
|
@@ Error (E (ErrorCode.InvalidRequest, "content-type must be 'utf-8'"))
|
||||||
|
|
||||||
|
let send_server_request (self : t) (req : 'from_server Lsp.Server_request.t)
|
||||||
|
(cb : ('from_server, Jsonrpc.Response.Error.t) result -> unit IO.t) :
|
||||||
|
Req_id.t IO.t =
|
||||||
|
server_request self (Request_and_handler (req, cb))
|
||||||
|
|
||||||
(** [shutdown ()] is called after processing each request to check if the server
|
(** [shutdown ()] is called after processing each request to check if the server
|
||||||
could wait for new messages.
|
could wait for new messages.
|
||||||
When launching an LSP server using [Server.Make.server], the
|
When launching an LSP server using [Server.Make.server], the
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,19 @@ module type S = sig
|
||||||
val create_stdio : server -> t
|
val create_stdio : server -> t
|
||||||
(** Create a connection using stdin/stdout *)
|
(** Create a connection using stdin/stdout *)
|
||||||
|
|
||||||
|
val send_server_notification : t -> Lsp.Server_notification.t -> unit IO.t
|
||||||
|
(** Send a notification from the server.
|
||||||
|
@since NEXT_RELEASE *)
|
||||||
|
|
||||||
|
val send_server_request :
|
||||||
|
t ->
|
||||||
|
'from_server Lsp.Server_request.t ->
|
||||||
|
(('from_server, Jsonrpc.Response.Error.t) result -> unit IO.t) ->
|
||||||
|
Req_id.t IO.t
|
||||||
|
(** Send a request from the server, and pass a callback that will be
|
||||||
|
called with the result in the future.
|
||||||
|
@since NEXT_RELEASE *)
|
||||||
|
|
||||||
val run : ?shutdown:(unit -> bool) -> t -> unit IO.t
|
val run : ?shutdown:(unit -> bool) -> t -> unit IO.t
|
||||||
(** Listen for incoming messages and responses.
|
(** Listen for incoming messages and responses.
|
||||||
@param shutdown if true, tells the server to shut down *)
|
@param shutdown if true, tells the server to shut down *)
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,8 @@ module Make (IO : IO) = struct
|
||||||
{ value = Lsp.Server_notification.Progress.End p; token }
|
{ value = Lsp.Server_notification.Progress.End p; token }
|
||||||
| None -> IO.return ()
|
| None -> IO.return ()
|
||||||
|
|
||||||
method send_notification (n : Lsp.Server_notification.t) = notify_back n
|
method send_notification (n : Lsp.Server_notification.t) : unit IO.t =
|
||||||
|
notify_back n
|
||||||
(** Send a notification from the server to the client (general purpose method) *)
|
(** Send a notification from the server to the client (general purpose method) *)
|
||||||
|
|
||||||
method send_request
|
method send_request
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue