mte/unikernel/duniverse/dune_/otherlibs/dune-rpc/private/procedures.ml
2025-11-11 02:07:51 +01:00

253 lines
6.9 KiB
OCaml

open Import
open Types
open Exported_types
module Public = struct
module Ping = struct
let v1 = Decl.Request.make_current_gen ~req:Conv.unit ~resp:Conv.unit ~version:1
let decl = Decl.Request.make ~method_:"ping" ~generations:[ v1 ]
end
module Diagnostics = struct
let v1 =
Decl.Request.make_gen
~version:1
~req:Conv.unit
~resp:(Conv.list Diagnostics_v1.sexp)
~upgrade_req:Fun.id
~downgrade_req:Fun.id
~upgrade_resp:(List.map ~f:Diagnostics_v1.to_diagnostic)
~downgrade_resp:(List.map ~f:Diagnostics_v1.of_diagnostic)
;;
let v2 =
Decl.Request.make_current_gen
~version:2
~req:Conv.unit
~resp:(Conv.list Diagnostic.sexp)
;;
let decl = Decl.Request.make ~method_:"diagnostics" ~generations:[ v1; v2 ]
end
module Shutdown = struct
let v1 = Decl.Notification.make_current_gen ~conv:Conv.unit ~version:1
let decl = Decl.Notification.make ~method_:"shutdown" ~generations:[ v1 ]
end
module Format_dune_file = struct
module V1 = struct
let req =
let open Conv in
let path = field "path" (required string) in
let contents = field "contents" (required string) in
let to_ (path, contents) = path, `Contents contents in
let from (path, `Contents contents) = path, contents in
iso (record (both path contents)) to_ from
;;
end
let v1 = Decl.Request.make_current_gen ~req:V1.req ~resp:Conv.string ~version:1
let decl = Decl.Request.make ~method_:"format-dune-file" ~generations:[ v1 ]
end
module Promote = struct
let v1 = Decl.Request.make_current_gen ~req:Path.sexp ~resp:Conv.unit ~version:1
let decl = Decl.Request.make ~method_:"promote" ~generations:[ v1 ]
end
module Promote_many = struct
let v1 =
Decl.Request.make_current_gen
~req:Files_to_promote.sexp
~resp:Build_outcome_with_diagnostics.sexp
~version:1
;;
let decl = Decl.Request.make ~method_:"promote_many" ~generations:[ v1 ]
end
module Build_dir = struct
let v1 = Decl.Request.make_current_gen ~req:Conv.unit ~resp:Path.sexp ~version:1
let decl = Decl.Request.make ~method_:"build_dir" ~generations:[ v1 ]
end
let ping = Ping.decl
let diagnostics = Diagnostics.decl
let shutdown = Shutdown.decl
let format_dune_file = Format_dune_file.decl
let promote = Promote.decl
let promote_many = Promote_many.decl
let build_dir = Build_dir.decl
end
module Server_side = struct
module Abort = struct
let v1 = Decl.Notification.make_current_gen ~conv:Message.sexp ~version:1
let decl = Decl.Notification.make ~method_:"notify/abort" ~generations:[ v1 ]
end
module Log = struct
let v1 = Decl.Notification.make_current_gen ~conv:Message.sexp ~version:1
let decl = Decl.Notification.make ~method_:"notify/log" ~generations:[ v1 ]
end
let abort = Abort.decl
let log = Log.decl
end
module Poll = struct
let cancel_gen = Decl.Notification.make_current_gen ~conv:Id.sexp ~version:1
module Name = struct
include String
let make s = s
end
type 'a t =
{ poll : (Id.t, 'a option) Decl.request
; cancel : Id.t Decl.notification
; name : Name.t
}
let make name generations =
let poll = Decl.Request.make ~method_:("poll/" ^ name) ~generations in
let cancel =
Decl.Notification.make ~method_:("cancel-poll/" ^ name) ~generations:[ cancel_gen ]
in
{ poll; cancel; name }
;;
let poll t = t.poll
let cancel t = t.cancel
let name t = t.name
module Progress = struct
module V1 = struct
type t =
| Waiting
| In_progress of
{ complete : int
; remaining : int
}
| Failed
| Interrupted
| Success
let sexp =
let open Conv in
let waiting = constr "waiting" unit (fun () -> Waiting) in
let failed = constr "failed" unit (fun () -> Failed) in
let in_progress =
let complete = field "complete" (required int) in
let remaining = field "remaining" (required int) in
constr
"in_progress"
(record (both complete remaining))
(fun (complete, remaining) -> In_progress { complete; remaining })
in
let interrupted = constr "interrupted" unit (fun () -> Interrupted) in
let success = constr "success" unit (fun () -> Success) in
let constrs =
List.map ~f:econstr [ waiting; failed; interrupted; success ]
@ [ econstr in_progress ]
in
let serialize = function
| Waiting -> case () waiting
| In_progress { complete; remaining } -> case (complete, remaining) in_progress
| Failed -> case () failed
| Interrupted -> case () interrupted
| Success -> case () success
in
sum constrs serialize
;;
let to_progress : t -> Progress.t = function
| Waiting -> Waiting
| In_progress { complete; remaining } ->
In_progress { complete; remaining; failed = 0 }
| Failed -> Failed
| Interrupted -> Interrupted
| Success -> Success
;;
let of_progress : Progress.t -> t = function
| Waiting -> Waiting
| In_progress { complete; remaining; failed = _ } ->
In_progress { complete; remaining }
| Failed -> Failed
| Interrupted -> Interrupted
| Success -> Success
;;
end
let name = "progress"
let v1 =
Decl.Request.make_gen
~version:1
~req:Id.sexp
~resp:(Conv.option V1.sexp)
~upgrade_req:Fun.id
~downgrade_req:Fun.id
~upgrade_resp:(Option.map ~f:V1.to_progress)
~downgrade_resp:(Option.map ~f:V1.of_progress)
;;
let v2 =
Decl.Request.make_current_gen
~version:2
~req:Id.sexp
~resp:(Conv.option Progress.sexp)
;;
end
module Diagnostic = struct
let name = "diagnostic"
let v1 =
Decl.Request.make_gen
~version:1
~req:Id.sexp
~resp:(Conv.option (Conv.list Diagnostics_v1.Event.sexp))
~upgrade_req:Fun.id
~downgrade_req:Fun.id
~upgrade_resp:(Option.map ~f:(List.map ~f:Diagnostics_v1.Event.to_event))
~downgrade_resp:(Option.map ~f:(List.map ~f:Diagnostics_v1.Event.of_event))
;;
let v2 =
Decl.Request.make_current_gen
~version:2
~req:Id.sexp
~resp:(Conv.option (Conv.list Diagnostic.Event.sexp))
;;
end
module Job = struct
let name = "running-jobs"
let v1 =
Decl.Request.make_current_gen
~req:Id.sexp
~resp:(Conv.option (Conv.list Job.Event.sexp))
~version:1
;;
end
let progress =
let open Progress in
make name [ v1; v2 ]
;;
let diagnostic =
let open Diagnostic in
make name [ v1; v2 ]
;;
let running_jobs =
let open Job in
make name [ v1 ]
;;
end