To focus the search input from anywhere on the page, press the 'S' key.
in-package search v0.1.0
Library
Module
Module type
Parameter
Class
Class type
Async.Command
is Core.Command
with additional Async functions.
include module type of Core.Command
with type t = Core.Command.t
with module Spec = Core.Command.Spec
module Arg_type = Core.Command.Arg_type
Argument types.
module Flag = Core.Command.Flag
Command-line flag specifications.
module Anons = Core.Command.Anons
Anonymous command-line argument specification.
module Param = Core.Command.Param
Command-line parameter specification.
module Let_syntax = Core.Command.Let_syntax
module Spec = Core.Command.Spec
The old interface for command-line specifications -- Do Not Use.
type t = Core.Command.t
Commands which can be combined into a hierarchy of subcommands.
val basic_spec : ('main, unit) basic_spec_command
basic_spec ~summary ?readme spec main
is a basic command that executes a function main
which is passed parameters parsed from the command line according to spec
. summary
is to contain a short one-line description of its behavior. readme
is to contain any longer description of its behavior that will go on that command's help screen.
val basic : unit basic_command
Same general behavior as basic_spec
, but takes a command line specification built up using Params
instead of Spec
.
val group :
summary:string ->
?readme:(unit -> string) ->
?preserve_subcommand_order:unit ->
?body:(path:string list -> unit) ->
(string * t) list ->
t
group ~summary subcommand_alist
is a compound command with named subcommands, as found in subcommand_alist
. summary
is to contain a short one-line description of the command group. readme
is to contain any longer description of its behavior that will go on that command's help screen.
NOTE: subcommand names containing underscores will be rejected; use dashes instead.
body
is called when no additional arguments are passed -- in particular, when no subcommand is passed. Its path
argument is the subcommand path by which the group command was reached.
val lazy_group :
summary:string ->
?readme:(unit -> string) ->
?preserve_subcommand_order:unit ->
?body:(path:string list -> unit) ->
(string * t) list Core_kernel.Lazy.t ->
t
lazy_group
is the same as group
, except that the list of subcommands may be generated lazily.
val exec :
summary:string ->
?readme:(unit -> string) ->
?child_subcommand:string list ->
path_to_exe:
[ `Absolute of string
| `Relative_to_argv0 of string
| `Relative_to_me of string ] ->
unit ->
t
exec ~summary ~path_to_exe
runs exec
on the executable at path_to_exe
. If path_to_exe
is `Absolute path
then path
is executed without any further qualification. If it is `Relative_to_me path
then Filename.dirname
Sys.executable_name ^ "/" ^ path
is executed instead. All of the usual caveats about Sys.executable_name
apply: specifically, it may only return an absolute path in Linux. On other operating systems it will return Sys.argv.(0)
. If it is `Relative_to_argv0 path
then Sys.argv.(0) ^ "/" ^ path
is executed.
The child_subcommand
argument allows referencing a subcommand one or more levels below the top-level of the child executable. It should not be used to pass flags or anonymous arguments to the child.
Care has been taken to support nesting multiple executables built with Command. In particular, recursive help and autocompletion should work as expected.
NOTE: Non-Command executables can be used with this function but will still be executed when help -recursive
is called or autocompletion is attempted (despite the fact that neither will be particularly helpful in this case). This means that if you have a shell script called "reboot-everything.sh" that takes no arguments and reboots everything no matter how it is called, you shouldn't use it with exec
.
Additionally, no loop detection is attempted, so if you nest an executable within itself, help -recursive
and autocompletion will hang forever (although actually running the subcommand will work).
val of_lazy : t Core_kernel.Lazy.t -> t
of_lazy thunk
constructs a lazy command that is forced only when necessary to run it or extract its shape.
val summary : t -> string
Extracts the summary string for a command.
module Shape = Core.Command.Shape
val run :
?version:string ->
?build_info:string ->
?argv:string list ->
?extend:(string list -> string list) ->
t ->
unit
Runs a command against Sys.argv
, or argv
if it is specified.
extend
can be used to add extra command line arguments to basic subcommands of the command. extend
will be passed the (fully expanded) path to a command, and its output will be appended to the list of arguments being processed. For example, suppose a program like this is compiled into exe
:
let bar = Command.basic ...
let foo = Command.group ~summary:... ["bar", bar]
let main = Command.group ~summary:... ["foo", foo]
Command.run ~extend:(fun _ -> ["-baz"]) main
Then if a user ran exe f b
, extend
would be passed ["foo"; "bar"]
and "-baz"
would be appended to the command line for processing by bar
. This can be used to add a default flags section to a user config file.
module Deprecated = Core.Command.Deprecated
Deprecated
should be used only by Core_extended.Deprecated_command
. At some point it will go away.
val async : unit Async_kernel.Deferred.t basic_command with_options
async
is like Core.Command.basic
, except that the main function it expects returns unit Deferred.t
, instead of unit
. async
will also start the Async scheduler before main is run, and will stop the scheduler when main returns.
async
also handles top-level exceptions by wrapping the user-supplied function in a Monitor.try_with
. If an exception is raised, it will print it to stderr and call shutdown 1
. The extract_exn
argument is passed along to Monitor.try_with
; by default it is false
.
val async_spec :
('a, unit Async_kernel.Deferred.t) basic_spec_command with_options
val async_or_error :
unit Async_kernel.Deferred.Or_error.t basic_command with_options
async_or_error
is like async
, except that the main function it expects may return an error, in which case it prints out the error message and shuts down with exit code 1.
val async_spec_or_error :
('a, unit Async_kernel.Deferred.Or_error.t) basic_spec_command with_options
Staged functions allow the main function to be separated into two stages. The first part is guaranteed to run before the Async scheduler is started, and the second part will run after the scheduler is started. This is useful if the main function runs code that relies on the fact that threads have not been created yet (e.g., Daemon.daemonize
).
As an example:
let main () =
assert (not (Scheduler.is_running ()));
stage (fun `Scheduler_started ->
assert (Scheduler.is_running ());
Deferred.unit
)
type 'r staged = ([ `Scheduler_started ] -> 'r) Core.Staged.t
module Staged : sig ... end
To create an Arg_type.t
that uses auto-completion and uses Async to compute the possible completions, one should use
Arg_type.create ~complete of_string
where complete
wraps its Async operations in Thread_safe.block_on_async
. With this, the complete
function is only called when the executable is auto-completing, not for ordinary execution. This improves performance, and also means that the Async scheduler isn't started for ordinary execution of the command, which makes it possible for the command to daemonize (which requires the scheduler to not have been started).