package tiny_libs

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

Source file Program.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
(* Claude Code
 *
 * Copyright (C) 2026 Yoann Padioleau
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public License
 * (LGPL) as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 *)

(* See Program.mli *)

let collecting = ref false

(* in reverse link order *)
let entries : (string * (unit -> unit)) list ref = ref []

let collect () : unit = collecting := true

let main (name : string) (entry : unit -> unit) : unit =
  if not !collecting then entry ()
  else if List.mem_assoc name !entries then
    failwith (Printf.sprintf "Program.main: two programs named %s" name)
  else entries := (name, entry) :: !entries

let collected () : (string * (unit -> unit)) list = List.rev !entries

(* None: the process's own, Sys.argv *)
let given_argv : string array option ref = ref None

let argv () : string array =
  match !given_argv with
  | Some a -> a
  (* claude: read while tinybox is still collecting: a program reading
   * the command line at its top level (Playground_platform.flags ()
   * outside its main), which would get tinybox's words, not its own *)
  | None when !collecting ->
      failwith "Program.argv: the command line read at the top level of a program, not in its main"
  | None -> Sys.argv

let run (name : string) ~(argv : string array) : unit =
  let entry = List.assoc name !entries in
  given_argv := Some argv;
  entry ()