Source file cmd_service.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
open Base
module Sig = Cmd_service_sig
let registered_commands : Cmd_core.t list ref = ref []
module Make () : Sig.SERVICE = struct
let register_commands commands =
registered_commands := List.concat [ !registered_commands; commands ]
let register_command command =
registered_commands := List.cons command !registered_commands
let find_command_by_args commands args =
args |> List.hd
|> Option.bind ~f:(fun name ->
commands
|> List.find ~f:(fun command ->
String.equal (Cmd_core.name command) name))
let print_all commands =
let command_list =
commands |> List.map ~f:Cmd_core.show |> String.concat ~sep:"\n"
in
Caml.print_endline
@@ Printf.sprintf
{|
______ _ __ __
.' ____ \ (_) [ | [ |
| (___ \_| __ | |--. | |
_.____`. [ | | .-. | | |
| \____) | | | | | | | | |
\______.'[___][___]|__][___]
--------------------------------------------
%s
--------------------------------------------
|}
command_list
let run () =
let args =
Sys.get_argv () |> Array.to_list |> List.tl |> Option.value ~default:[]
in
let commands = !registered_commands in
let command = find_command_by_args commands args in
match command with
| Some command ->
let rest_args = args |> List.tl |> Option.value ~default:[] in
Cmd_core.fn command rest_args
| None ->
print_all commands;
Lwt.return ()
let start ctx = Lwt.return ctx
let stop _ = Lwt.return ()
let lifecycle = Core.Container.Lifecycle.make ~start ~stop "cmd"
end