mirror of
https://github.com/c-cube/linol.git
synced 2026-05-05 08:54:26 -04:00
68 lines
1.7 KiB
OCaml
68 lines
1.7 KiB
OCaml
open struct
|
|
module Lsp = Linol_lsp.Lsp
|
|
end
|
|
|
|
module type IO = Linol.IO
|
|
|
|
module IO_eio :
|
|
IO
|
|
with type 'a t = 'a
|
|
and type env = Eio_unix.Stdenv.base
|
|
and type in_channel = Eio.Buf_read.t
|
|
and type out_channel = Eio.Mutex.t * Eio_unix.sink_ty Eio.Std.r = struct
|
|
type 'a t = 'a
|
|
|
|
let ( let+ ) x f = f x
|
|
let ( let* ) x f = f x
|
|
let ( and+ ) a b = a, b
|
|
let return x = x
|
|
let failwith = failwith
|
|
let fail = raise
|
|
|
|
let catch f handler =
|
|
try f ()
|
|
with exn ->
|
|
let bt = Printexc.get_raw_backtrace () in
|
|
handler exn bt
|
|
|
|
let stdin env =
|
|
Eio.Buf_read.of_flow ~max_size:1_000_000 (Eio.Stdenv.stdin env)
|
|
|
|
let stdout_mutex = Eio.Mutex.create ()
|
|
let stdout env = stdout_mutex, Eio.Stdenv.stdout env
|
|
|
|
type env = Eio_unix.Stdenv.base
|
|
type in_channel = Eio.Buf_read.t
|
|
type out_channel = Eio.Mutex.t * Eio_unix.sink_ty Eio.Std.r
|
|
|
|
let write_string (mutex, out_ch) str =
|
|
Eio.Mutex.use_rw ~protect:false mutex (fun () ->
|
|
Eio.Flow.copy_string str out_ch)
|
|
|
|
let write (mutex, out_ch) bytes off len =
|
|
Eio.Mutex.use_rw ~protect:false mutex (fun () ->
|
|
Eio.Buf_write.with_flow out_ch @@ fun w ->
|
|
Eio.Buf_write.bytes w ~off ~len bytes)
|
|
|
|
let read in_ch bytes off len =
|
|
let str = Eio.Buf_read.take len in_ch in
|
|
Bytes.blit_string str off bytes 0 len
|
|
|
|
let read_line in_ch = Eio.Buf_read.line in_ch
|
|
end
|
|
|
|
(** Spawn function. *)
|
|
let spawn ~sw f =
|
|
Eio.Fiber.fork ~sw (fun () ->
|
|
try f ()
|
|
with exn ->
|
|
Printf.eprintf "uncaught exception in `spawn`:\n%s\n%!"
|
|
(Printexc.to_string exn);
|
|
raise exn)
|
|
|
|
include Lsp.Types
|
|
include IO_eio
|
|
|
|
type doc_state = Linol.Server.doc_state
|
|
|
|
module Jsonrpc2 = Linol.Jsonrpc2.Make (IO_eio)
|