package sihl

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

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 ->
        (* We use the first argument to find the command, the command it self receives all the rest *)
        let rest_args = args |> List.tl |> Option.value ~default:[] in
        (* TODO catch all exceptions here *)
        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
OCaml

Innovation. Community. Security.