My agentic slop goes here. Not intended for anyone else!

cmdliner 2

+2 -1
.devcontainer/setup-ocaml.sh
···
alcotest \
ctypes \
ctypes-foreign \
-
lambdasoup
echo "Setting up shell environment..."
echo 'eval $(opam env)' >> ~/.bashrc
···
alcotest \
ctypes \
ctypes-foreign \
+
lambdasoup \
+
cmarkit
echo "Setting up shell environment..."
echo 'eval $(opam env)' >> ~/.bashrc
+2
CLAUDE.md
···
···
+
This is a monorepo of a collection of OCaml libraries that should all work together, but they are in different stages of porting. Ultimately, the goal is to use Eio for everything and move away from Lwt entirely. For HTTP(S) requests the idea is to use River as the main high evel 'http requests' API, so anything using Cohttp or other HTTP fetchers will need to be ported.
+
+1 -1
stack/bushel/bushel.opam
···
"peertube"
"karakeep"
"typesense-client"
-
"cmdliner"
"odoc" {with-doc}
]
build: [
···
"peertube"
"karakeep"
"typesense-client"
+
"cmdliner" {>= "2.0.0"}
"odoc" {with-doc}
]
build: [
+1 -1
stack/bushel/dune-project
···
peertube
karakeep
typesense-client
-
cmdliner))
(package
(name peertube)
···
peertube
karakeep
typesense-client
+
(cmdliner (>= 2.0.0))))
(package
(name peertube)
+1 -1
stack/cacheio/cacheio.opam
···
"ocaml"
"dune" {>= "3.16"}
"eio"
-
"cmdliner" {>= "1.3.0"}
"yojson"
"ptime"
"logs"
···
"ocaml"
"dune" {>= "3.16"}
"eio"
+
"cmdliner" {>= "2.0.0"}
"yojson"
"ptime"
"logs"
+1 -1
stack/cacheio/dune-project
···
ocaml
dune
eio
-
(cmdliner (>= 1.3.0))
yojson
ptime
logs
···
ocaml
dune
eio
+
(cmdliner (>= 2.0.0))
yojson
ptime
logs
+1 -1
stack/crockford/crockford.opam
···
"ocaml" {>= "4.14.1"}
"odoc" {with-doc}
"alcotest" {with-test & >= "1.9.0"}
-
"cmdliner" {>= "1.1.0"}
]
build: [
["dune" "subst"] {dev}
···
"ocaml" {>= "4.14.1"}
"odoc" {with-doc}
"alcotest" {with-test & >= "1.9.0"}
+
"cmdliner" {>= "2.0.0"}
]
build: [
["dune" "subst"] {dev}
+1 -1
stack/crockford/dune-project
···
(ocaml (>= 4.14.1))
(odoc :with-doc)
(alcotest (and :with-test (>= 1.9.0)))
-
(cmdliner (>= 1.1.0))))
···
(ocaml (>= 4.14.1))
(odoc :with-doc)
(alcotest (and :with-test (>= 1.9.0)))
+
(cmdliner (>= 2.0.0))))
+1 -1
stack/mltessera/dune-project
···
dune
toru
lonlat
-
cmdliner
eio
eio_main
yojson
···
dune
toru
lonlat
+
(cmdliner (>= 2.0.0))
eio
eio_main
yojson
+1 -1
stack/mltessera/mltessera.opam
···
"dune" {>= "3.0"}
"toru"
"lonlat"
-
"cmdliner"
"eio"
"eio_main"
"yojson"
···
"dune" {>= "3.0"}
"toru"
"lonlat"
+
"cmdliner" {>= "2.0.0"}
"eio"
"eio_main"
"yojson"
+4 -4
stack/requests/bin/ocurl.ml
···
("PATCH", `PATCH);
] in
let doc = "HTTP method to use" in
-
let env = Cmd.Env.info "OCURL_METHOD" in
-
Arg.(value & opt (enum methods) `GET & info ["X"; "request"] ~env ~docv:"METHOD" ~doc)
let urls =
let doc = "URL(s) to fetch" in
···
let enable_cache =
let doc = "Enable HTTP response caching for GET and HEAD requests" in
-
let env = Cmd.Env.info "OCURL_ENABLE_CACHE" in
-
Arg.(value & flag & info ["enable-cache"] ~env ~doc)
(* Logging setup *)
(* Setup logging using Logs_cli for standard logging options *)
···
("PATCH", `PATCH);
] in
let doc = "HTTP method to use" in
+
let env_info = Cmdliner.Cmd.Env.info "OCURL_METHOD" in
+
Arg.(value & opt (enum methods) `GET & info ["X"; "request"] ~env:env_info ~docv:"METHOD" ~doc)
let urls =
let doc = "URL(s) to fetch" in
···
let enable_cache =
let doc = "Enable HTTP response caching for GET and HEAD requests" in
+
let env_info = Cmdliner.Cmd.Env.info "OCURL_ENABLE_CACHE" in
+
Arg.(value & flag & info ["enable-cache"] ~env:env_info ~doc)
(* Logging setup *)
(* Setup logging using Logs_cli for standard logging options *)
+19 -19
stack/requests/lib/requests.ml
···
let persist_cookies_term app_name =
let doc = "Persist cookies to disk between sessions" in
let env_name = String.uppercase_ascii app_name ^ "_PERSIST_COOKIES" in
-
let env = Cmd.Env.info env_name in
-
Arg.(value & flag & info ["persist-cookies"] ~env ~doc)
let verify_tls_term app_name =
let doc = "Skip TLS certificate verification (insecure)" in
let env_name = String.uppercase_ascii app_name ^ "_NO_VERIFY_TLS" in
-
let env = Cmd.Env.info env_name in
Term.(const (fun no_verify -> not no_verify) $
-
Arg.(value & flag & info ["no-verify-tls"] ~env ~doc))
let timeout_term app_name =
let doc = "Request timeout in seconds" in
let env_name = String.uppercase_ascii app_name ^ "_TIMEOUT" in
-
let env = Cmd.Env.info env_name in
-
Arg.(value & opt (some float) None & info ["timeout"] ~env ~docv:"SECONDS" ~doc)
let retries_term app_name =
let doc = "Maximum number of request retries" in
let env_name = String.uppercase_ascii app_name ^ "_MAX_RETRIES" in
-
let env = Cmd.Env.info env_name in
-
Arg.(value & opt int 3 & info ["max-retries"] ~env ~docv:"N" ~doc)
let retry_backoff_term app_name =
let doc = "Retry backoff factor for exponential delay" in
let env_name = String.uppercase_ascii app_name ^ "_RETRY_BACKOFF" in
-
let env = Cmd.Env.info env_name in
-
Arg.(value & opt float 0.3 & info ["retry-backoff"] ~env ~docv:"FACTOR" ~doc)
let follow_redirects_term app_name =
let doc = "Don't follow HTTP redirects" in
let env_name = String.uppercase_ascii app_name ^ "_NO_FOLLOW_REDIRECTS" in
-
let env = Cmd.Env.info env_name in
Term.(const (fun no_follow -> not no_follow) $
-
Arg.(value & flag & info ["no-follow-redirects"] ~env ~doc))
let max_redirects_term app_name =
let doc = "Maximum number of redirects to follow" in
let env_name = String.uppercase_ascii app_name ^ "_MAX_REDIRECTS" in
-
let env = Cmd.Env.info env_name in
-
Arg.(value & opt int 10 & info ["max-redirects"] ~env ~docv:"N" ~doc)
let user_agent_term app_name =
let doc = "User-Agent header to send with requests" in
let env_name = String.uppercase_ascii app_name ^ "_USER_AGENT" in
-
let env = Cmd.Env.info env_name in
-
Arg.(value & opt (some string) None & info ["user-agent"] ~env ~docv:"STRING" ~doc)
(* Combined terms *)
···
$ max_redirects_term app_name
$ user_agent_term app_name)
-
let requests_term app_name env sw =
-
let config_t = config_term app_name env#fs in
-
Term.(const (fun config -> create config env sw) $ config_t)
let minimal_term app_name fs =
let xdg_term = Xdge.Cmd.term app_name fs
···
let persist_cookies_term app_name =
let doc = "Persist cookies to disk between sessions" in
let env_name = String.uppercase_ascii app_name ^ "_PERSIST_COOKIES" in
+
let env_info = Cmdliner.Cmd.Env.info env_name in
+
Arg.(value & flag & info ["persist-cookies"] ~env:env_info ~doc)
let verify_tls_term app_name =
let doc = "Skip TLS certificate verification (insecure)" in
let env_name = String.uppercase_ascii app_name ^ "_NO_VERIFY_TLS" in
+
let env_info = Cmdliner.Cmd.Env.info env_name in
Term.(const (fun no_verify -> not no_verify) $
+
Arg.(value & flag & info ["no-verify-tls"] ~env:env_info ~doc))
let timeout_term app_name =
let doc = "Request timeout in seconds" in
let env_name = String.uppercase_ascii app_name ^ "_TIMEOUT" in
+
let env_info = Cmdliner.Cmd.Env.info env_name in
+
Arg.(value & opt (some float) None & info ["timeout"] ~env:env_info ~docv:"SECONDS" ~doc)
let retries_term app_name =
let doc = "Maximum number of request retries" in
let env_name = String.uppercase_ascii app_name ^ "_MAX_RETRIES" in
+
let env_info = Cmdliner.Cmd.Env.info env_name in
+
Arg.(value & opt int 3 & info ["max-retries"] ~env:env_info ~docv:"N" ~doc)
let retry_backoff_term app_name =
let doc = "Retry backoff factor for exponential delay" in
let env_name = String.uppercase_ascii app_name ^ "_RETRY_BACKOFF" in
+
let env_info = Cmdliner.Cmd.Env.info env_name in
+
Arg.(value & opt float 0.3 & info ["retry-backoff"] ~env:env_info ~docv:"FACTOR" ~doc)
let follow_redirects_term app_name =
let doc = "Don't follow HTTP redirects" in
let env_name = String.uppercase_ascii app_name ^ "_NO_FOLLOW_REDIRECTS" in
+
let env_info = Cmdliner.Cmd.Env.info env_name in
Term.(const (fun no_follow -> not no_follow) $
+
Arg.(value & flag & info ["no-follow-redirects"] ~env:env_info ~doc))
let max_redirects_term app_name =
let doc = "Maximum number of redirects to follow" in
let env_name = String.uppercase_ascii app_name ^ "_MAX_REDIRECTS" in
+
let env_info = Cmdliner.Cmd.Env.info env_name in
+
Arg.(value & opt int 10 & info ["max-redirects"] ~env:env_info ~docv:"N" ~doc)
let user_agent_term app_name =
let doc = "User-Agent header to send with requests" in
let env_name = String.uppercase_ascii app_name ^ "_USER_AGENT" in
+
let env_info = Cmdliner.Cmd.Env.info env_name in
+
Arg.(value & opt (some string) None & info ["user-agent"] ~env:env_info ~docv:"STRING" ~doc)
(* Combined terms *)
···
$ max_redirects_term app_name
$ user_agent_term app_name)
+
let requests_term app_name eio_env sw =
+
let config_t = config_term app_name eio_env#fs in
+
Term.(const (fun config -> create config eio_env sw) $ config_t)
let minimal_term app_name fs =
let xdg_term = Xdge.Cmd.term app_name fs
+1 -1
stack/river/dune-project
···
ptime
lambdasoup
uri
-
cmdliner
yojson
fmt
xdge
···
ptime
lambdasoup
uri
+
(cmdliner (>= 2.0.0))
yojson
fmt
xdge
+1 -1
stack/river/river.opam
···
"ptime"
"lambdasoup"
"uri"
-
"cmdliner"
"yojson"
"fmt"
"xdge"
···
"ptime"
"lambdasoup"
"uri"
+
"cmdliner" {>= "2.0.0"}
"yojson"
"fmt"
"xdge"
+19 -18
stack/toru/bin/toru_cache.ml
···
0
(* Command definitions *)
-
let info_cmd_def env sw =
let doc = "Show cache statistics and location" in
-
let term = Term.(const (info_cmd env sw) $ global_opts_term) in
Cmd.v (Cmd.info "info" ~doc) term
-
let list_cmd_def env sw =
let sort_by =
let doc = "Sort files by size, age, or name" in
Arg.(value & opt (enum [("size", `Size); ("age", `Age); ("name", `Name)]) `Name &
···
Arg.(value & opt (some int) None & info ["limit"; "n"] ~docv:"N" ~doc)
in
let doc = "List cached files with details" in
-
let term = Term.(const (list_cmd env sw) $ global_opts_term $ sort_by $ format $ limit) in
Cmd.v (Cmd.info "list" ~doc) term
-
let size_cmd_def env sw =
let breakdown =
let doc = "Show size breakdown by file type and age" in
Arg.(value & flag & info ["breakdown"; "b"] ~doc)
···
Arg.(value & flag & info ["human-readable"; "h"] ~doc)
in
let doc = "Show cache size information" in
-
let term = Term.(const (size_cmd env sw) $ global_opts_term $ breakdown $ human_readable) in
Cmd.v (Cmd.info "size" ~doc) term
-
let clean_cmd_def env sw =
let max_size =
let doc = "Remove files to get cache under this size (e.g., 1GB, 500MB)" in
let parse_size s =
let s = String.uppercase_ascii s in
let len = String.length s in
-
if len < 2 then `Error "Invalid size format"
else
-
let (num_str, unit) =
if String.sub s (len-2) 2 = "GB" then
(String.sub s 0 (len-2), Int64.(mul 1024L (mul 1024L 1024L)))
else if String.sub s (len-2) 2 = "MB" then
···
in
try
let num = Float.of_string num_str in
-
`Ok (Int64.of_float (num *. Int64.to_float unit))
with
-
| _ -> `Error "Invalid number in size"
in
-
Arg.(value & opt (some (parse_size, fun fmt size ->
-
Format.fprintf fmt "%Ld" size)) None & info ["max-size"] ~docv:"SIZE" ~doc)
in
let max_age =
let doc = "Remove files older than this many days" in
···
Arg.(value & flag & info ["dry-run"; "n"] ~doc)
in
let doc = "Clean cache with various options" in
-
let term = Term.(const (clean_cmd env sw) $ global_opts_term $ max_size $ max_age $ dry_run) in
Cmd.v (Cmd.info "clean" ~doc) term
-
let vacuum_cmd_def env sw =
let dry_run =
let doc = "Show what would be removed without actually removing" in
Arg.(value & flag & info ["dry-run"; "n"] ~doc)
in
let doc = "Remove empty directories and broken links" in
-
let term = Term.(const (vacuum_cmd env sw) $ global_opts_term $ dry_run) in
Cmd.v (Cmd.info "vacuum" ~doc) term
-
let main_cmd env sw =
let doc = "Toru cache management tool" in
let sdocs = Manpage.s_common_options in
let man = [
···
] in
let default = Term.(const 0) in
Cmd.group ~default (Cmd.info "toru-cache" ~version:"0.1.0" ~doc ~sdocs ~man)
-
[info_cmd_def env sw; list_cmd_def env sw; size_cmd_def env sw; clean_cmd_def env sw; vacuum_cmd_def env sw]
let () =
Eio_main.run @@ fun env ->
···
0
(* Command definitions *)
+
let info_cmd_def eio_env sw =
let doc = "Show cache statistics and location" in
+
let term = Term.(const (info_cmd eio_env sw) $ global_opts_term) in
Cmd.v (Cmd.info "info" ~doc) term
+
let list_cmd_def eio_env sw =
let sort_by =
let doc = "Sort files by size, age, or name" in
Arg.(value & opt (enum [("size", `Size); ("age", `Age); ("name", `Name)]) `Name &
···
Arg.(value & opt (some int) None & info ["limit"; "n"] ~docv:"N" ~doc)
in
let doc = "List cached files with details" in
+
let term = Term.(const (list_cmd eio_env sw) $ global_opts_term $ sort_by $ format $ limit) in
Cmd.v (Cmd.info "list" ~doc) term
+
let size_cmd_def eio_env sw =
let breakdown =
let doc = "Show size breakdown by file type and age" in
Arg.(value & flag & info ["breakdown"; "b"] ~doc)
···
Arg.(value & flag & info ["human-readable"; "h"] ~doc)
in
let doc = "Show cache size information" in
+
let term = Term.(const (size_cmd eio_env sw) $ global_opts_term $ breakdown $ human_readable) in
Cmd.v (Cmd.info "size" ~doc) term
+
let clean_cmd_def eio_env sw =
let max_size =
let doc = "Remove files to get cache under this size (e.g., 1GB, 500MB)" in
let parse_size s =
let s = String.uppercase_ascii s in
let len = String.length s in
+
if len < 2 then Error "Invalid size format"
else
+
let (num_str, unit) =
if String.sub s (len-2) 2 = "GB" then
(String.sub s 0 (len-2), Int64.(mul 1024L (mul 1024L 1024L)))
else if String.sub s (len-2) 2 = "MB" then
···
in
try
let num = Float.of_string num_str in
+
Ok (Int64.of_float (num *. Int64.to_float unit))
with
+
| _ -> Error "Invalid number in size"
in
+
let size_conv = Arg.conv' (parse_size, fun fmt size ->
+
Format.fprintf fmt "%Ld" size) in
+
Arg.(value & opt (some size_conv) None & info ["max-size"] ~docv:"SIZE" ~doc)
in
let max_age =
let doc = "Remove files older than this many days" in
···
Arg.(value & flag & info ["dry-run"; "n"] ~doc)
in
let doc = "Clean cache with various options" in
+
let term = Term.(const (clean_cmd eio_env sw) $ global_opts_term $ max_size $ max_age $ dry_run) in
Cmd.v (Cmd.info "clean" ~doc) term
+
let vacuum_cmd_def eio_env sw =
let dry_run =
let doc = "Show what would be removed without actually removing" in
Arg.(value & flag & info ["dry-run"; "n"] ~doc)
in
let doc = "Remove empty directories and broken links" in
+
let term = Term.(const (vacuum_cmd eio_env sw) $ global_opts_term $ dry_run) in
Cmd.v (Cmd.info "vacuum" ~doc) term
+
let main_cmd eio_env sw =
let doc = "Toru cache management tool" in
let sdocs = Manpage.s_common_options in
let man = [
···
] in
let default = Term.(const 0) in
Cmd.group ~default (Cmd.info "toru-cache" ~version:"0.1.0" ~doc ~sdocs ~man)
+
[info_cmd_def eio_env sw; list_cmd_def eio_env sw; size_cmd_def eio_env sw; clean_cmd_def eio_env sw; vacuum_cmd_def eio_env sw]
let () =
Eio_main.run @@ fun env ->
+13 -13
stack/toru/bin/toru_main.ml
···
let resolved_cache_dir = resolve_cache_dir app_name cache_dir in
{ app_name; cache_dir = Some resolved_cache_dir; version; verbose_level; env }
-
let global_opts_t env =
let app_name =
let doc = "Application name for cache and config directories" in
Arg.(value & opt string "toru" & info ["app-name"; "a"] ~doc)
···
Arg.(value & flag_all & info ["verbose"; "v"] ~doc)
in
Term.(const (fun app_name cache_dir version verbose_flags ->
-
create_global_opts app_name cache_dir version (List.length verbose_flags) env
) $ app_name $ cache_dir $ version $ verbose_count)
(** Registry inspect command *)
-
let inspect_cmd env =
let registry_source =
let doc = "Registry file path or URL to inspect" in
Arg.(required & pos 0 (some string) None & info [] ~docv:"REGISTRY" ~doc)
···
| exn -> `Error (false, "Failed to inspect registry: " ^ (Printexc.to_string exn))
in
-
let term env = Term.(ret (const inspect $ global_opts_t env $ registry_source $ show_stats $ list_files $ search_pattern)) in
let info = Cmd.info "inspect" ~doc:"Inspect a registry file or URL" in
-
Cmd.v info (term env)
(** Registry validate command *)
-
let validate_cmd env =
let registry_source =
let doc = "Registry file path or URL to validate" in
Arg.(required & pos 0 (some string) None & info [] ~docv:"REGISTRY" ~doc)
in
-
let check_hashes =
let doc = "Check if all hash formats are valid" in
Arg.(value & flag & info ["check-hashes"] ~doc)
in
-
let validate global_opts registry_source check_hashes =
try
Toru.Logging.Cli.info (fun m -> m "Validating registry: %s" registry_source);
···
| exn -> `Error (false, "Registry validation failed: " ^ (Printexc.to_string exn))
in
-
let term env = Term.(ret (const validate $ global_opts_t env $ registry_source $ check_hashes)) in
let info = Cmd.info "validate" ~doc:"Validate a registry file format and integrity" in
-
Cmd.v info (term env)
(** Registry convert command *)
-
let convert_cmd env =
let input_registry =
let doc = "Input registry file path or URL" in
Arg.(required & pos 0 (some string) None & info [] ~docv:"INPUT" ~doc)
···
| exn -> `Error (false, "Conversion failed: " ^ (Printexc.to_string exn))
in
-
let term env = Term.(ret (const convert $ global_opts_t env $ input_registry $ output_file)) in
let info = Cmd.info "convert" ~doc:"Convert registry between different formats or sources" in
-
Cmd.v info (term env)
(** Main command *)
let main_cmd env =
···
let resolved_cache_dir = resolve_cache_dir app_name cache_dir in
{ app_name; cache_dir = Some resolved_cache_dir; version; verbose_level; env }
+
let global_opts_t eio_env =
let app_name =
let doc = "Application name for cache and config directories" in
Arg.(value & opt string "toru" & info ["app-name"; "a"] ~doc)
···
Arg.(value & flag_all & info ["verbose"; "v"] ~doc)
in
Term.(const (fun app_name cache_dir version verbose_flags ->
+
create_global_opts app_name cache_dir version (List.length verbose_flags) eio_env
) $ app_name $ cache_dir $ version $ verbose_count)
(** Registry inspect command *)
+
let inspect_cmd eio_env =
let registry_source =
let doc = "Registry file path or URL to inspect" in
Arg.(required & pos 0 (some string) None & info [] ~docv:"REGISTRY" ~doc)
···
| exn -> `Error (false, "Failed to inspect registry: " ^ (Printexc.to_string exn))
in
+
let term eio_env = Term.(ret (const inspect $ global_opts_t eio_env $ registry_source $ show_stats $ list_files $ search_pattern)) in
let info = Cmd.info "inspect" ~doc:"Inspect a registry file or URL" in
+
Cmd.v info (term eio_env)
(** Registry validate command *)
+
let validate_cmd eio_env =
let registry_source =
let doc = "Registry file path or URL to validate" in
Arg.(required & pos 0 (some string) None & info [] ~docv:"REGISTRY" ~doc)
in
+
let check_hashes =
let doc = "Check if all hash formats are valid" in
Arg.(value & flag & info ["check-hashes"] ~doc)
in
+
let validate global_opts registry_source check_hashes =
try
Toru.Logging.Cli.info (fun m -> m "Validating registry: %s" registry_source);
···
| exn -> `Error (false, "Registry validation failed: " ^ (Printexc.to_string exn))
in
+
let term eio_env = Term.(ret (const validate $ global_opts_t eio_env $ registry_source $ check_hashes)) in
let info = Cmd.info "validate" ~doc:"Validate a registry file format and integrity" in
+
Cmd.v info (term eio_env)
(** Registry convert command *)
+
let convert_cmd eio_env =
let input_registry =
let doc = "Input registry file path or URL" in
Arg.(required & pos 0 (some string) None & info [] ~docv:"INPUT" ~doc)
···
| exn -> `Error (false, "Conversion failed: " ^ (Printexc.to_string exn))
in
+
let term eio_env = Term.(ret (const convert $ global_opts_t eio_env $ input_registry $ output_file)) in
let info = Cmd.info "convert" ~doc:"Convert registry between different formats or sources" in
+
Cmd.v info (term eio_env)
(** Main command *)
let main_cmd env =
+2 -2
stack/toru/bin/toru_make_registry_simple.ml
···
exit 1
(* Command definition *)
-
let cmd env sw =
let doc = "Generate Pooch-compatible registry files from directories (simple version)" in
let info = Cmd.info "toru-make-registry-simple" ~version:"1.0" ~doc in
-
Cmd.v info Term.(const (make_registry_main env sw)
$ directory_arg $ output_arg $ recursive_arg
$ algorithm_arg $ progress_arg $ const ())
···
exit 1
(* Command definition *)
+
let cmd eio_env sw =
let doc = "Generate Pooch-compatible registry files from directories (simple version)" in
let info = Cmd.info "toru-make-registry-simple" ~version:"1.0" ~doc in
+
Cmd.v info Term.(const (make_registry_main eio_env sw)
$ directory_arg $ output_arg $ recursive_arg
$ algorithm_arg $ progress_arg $ const ())
+1 -1
stack/toru/dune-project
···
(eio (>= 1.0))
digestif
yojson
-
cmdliner
progress
re
fmt
···
(eio (>= 1.0))
digestif
yojson
+
(cmdliner (>= 2.0.0))
progress
re
fmt
+4 -4
stack/toru/lib/toru/cmd.ml
···
let parse s =
match String.split_on_char ':' s with
| [user; pass] -> Ok (user, pass)
-
| _ -> Error (`Msg "Auth must be username:password")
in
let pp fmt (u, p) = Format.fprintf fmt "%s:%s" u p in
-
let auth_conv = Arg.conv (parse, pp) in
Arg.(value & opt (some auth_conv) None
& info ["auth"] ~docv:"USER:PASS" ~doc)
···
| "gunzip" -> Ok `Gunzip
| "bunzip2" -> Ok `Bunzip2
| "none" -> Ok `None
-
| s -> Error (`Msg ("Unknown processor: " ^ s))
in
let pp fmt = function
| `Auto -> Format.pp_print_string fmt "auto"
···
| `Bunzip2 -> Format.pp_print_string fmt "bunzip2"
| `None -> Format.pp_print_string fmt "none"
in
-
let proc_conv = Arg.conv (parse, pp) in
Arg.(value & opt proc_conv `Auto
& info ["p"; "processor"] ~docv:"PROC" ~doc)
···
let parse s =
match String.split_on_char ':' s with
| [user; pass] -> Ok (user, pass)
+
| _ -> Error "Auth must be username:password"
in
let pp fmt (u, p) = Format.fprintf fmt "%s:%s" u p in
+
let auth_conv = Arg.conv' (parse, pp) in
Arg.(value & opt (some auth_conv) None
& info ["auth"] ~docv:"USER:PASS" ~doc)
···
| "gunzip" -> Ok `Gunzip
| "bunzip2" -> Ok `Bunzip2
| "none" -> Ok `None
+
| s -> Error ("Unknown processor: " ^ s)
in
let pp fmt = function
| `Auto -> Format.pp_print_string fmt "auto"
···
| `Bunzip2 -> Format.pp_print_string fmt "bunzip2"
| `None -> Format.pp_print_string fmt "none"
in
+
let proc_conv = Arg.conv' (parse, pp) in
Arg.(value & opt proc_conv `Auto
& info ["p"; "processor"] ~docv:"PROC" ~doc)
+2 -2
stack/zulip/examples/echo_bot.ml
···
let verbosity_term =
Term.(const List.length $ verbosity)
-
let bot_cmd env =
let doc = "Zulip Echo Bot with verbose logging" in
let man = [
`S Manpage.s_description;
···
`P "zulip(1), zulip-bot(1)";
] in
let info = Cmd.info "echo_bot" ~version:"1.0.0" ~doc ~man in
-
Cmd.v info Term.(const (run_echo_bot) $ config_file $ verbosity_term $ const env)
let () =
(* Initialize the cryptographic RNG for the application *)
···
let verbosity_term =
Term.(const List.length $ verbosity)
+
let bot_cmd eio_env =
let doc = "Zulip Echo Bot with verbose logging" in
let man = [
`S Manpage.s_description;
···
`P "zulip(1), zulip-bot(1)";
] in
let info = Cmd.info "echo_bot" ~version:"1.0.0" ~doc ~man in
+
Cmd.v info Term.(const (run_echo_bot) $ config_file $ verbosity_term $ const eio_env)
let () =
(* Initialize the cryptographic RNG for the application *)