newbie question:
I think I followed (but most likely have made some mistake) in how to handle a CmdLiner.Term project which has 7 subcommands, each with 0, 1, or 2 arguments.
I am two issues I am seeing
The command
ocommander TemplateCreate takes two arguments -name NAME -path PATH
But when I run it with no arguments, I find it invokes two addidtional commands (oCmmand and templateList) which have no arguments, in addition to the TemplateCreate command.
(as you can see I am using BuckleScript to execute, but I donβt think that is the issue).
D:\CRIME\ocommander\src>node ocommander.bs.js TemplateCreate
* dummy - do not call * ** template list called in error ** TemplateCreate - name: *dummy* path:
The second issue is tied to this. What I am really want to say is that TemplateCreate has two REQUIRED arguments -name NAME and -path PATH
and if they are not supplied then help for TemplateCreate should be shown. I guess what I am asking for is REQUIRED options (maybe an oxymoron), but I donβt want positional arguments, since the order is not important, and folks like the -arg VALUE syntax.
The code probably has too much boilerplate, but it does make it easy to read:
(* Demo, just print the args. *)
open Cmdliner
[%%raw "process.argv.shift()"]
let actionHelp = [
`S "COMMAND HELP";
`P "Use `$(mname) $(i,COMMAND) --help' for help on a single command.";
`S Manpage.s_bugs; `P "Email bug reports to jpaasch@draper.com";]
(* Actions *)
let oCommander =
Printf.printf "* dummy - do not call * "
let templateCreate name path =
Printf.printf "TemplateCreate - name: %s path: %s" name path
let templateDetails name =
Printf.printf "TemplateDetails - name: %s" name
let templateList =
Printf.printf "** template list called in error ** "
let deployStack deployment template provider =
Printf.printf "DeployStack - deployment: %s template: %s provider: %s" deployment template provider
let deployRemove deployment template provider =
Printf.printf "DeployRemove - deployment: %s template: %s provider: %s" deployment template provider
(* Arguments *)
let nameArg =
let doc = "$(docv) of the template" in
Arg.(value & opt string "*dummy*" & info ["n"; "name"] ~docv:"NAME" ~doc)
let pathArg =
let doc = "$(docv) to template file" in
Arg.(value & opt string "" & info ["p"; "path"] ~docv:"PATH" ~doc)
let deployArg =
let doc = "$(docv) - name to use for deployment" in
Arg.(value & opt string "" & info ["d"; "deployment"] ~docv:"DEPLOYMENT" ~doc)
let templateArg =
let doc = "$(docv) - name of template" in
Arg.(value & opt string "" & info ["t"; "template"] ~docv:"TEMPLATE" ~doc)
let providerArg =
let doc = "$(docv) - cloud Provider (e.g. AWS)" in
Arg.(value & opt string "" & info ["p"; "provider"] ~docv:"PROVIDER" ~doc)
(* Help Terms *)
let oCommanderHelp =
let doc = "CLI for CRIME System" in
let exits = Term.default_exits in
let man = [`Blocks actionHelp; ] in
Term.(const oCommander ),
Term.info "oCommander" ~doc ~exits ~version:"0.1.0" ~man
let templateCreateHelp =
let doc = "Create a Template from a file" in
let exits = Term.default_exits in
Term.(const templateCreate $ nameArg $ pathArg),
Term.info "TemplateCreate" ~doc ~exits
let templateDetailsHelp =
let doc = "Show Details about a Template" in
let exits = Term.default_exits in
Term.(const templateDetails $ nameArg ),
Term.info "TemplateDetails" ~doc ~exits
let templateListHelp =
let doc = "List all Templates for this user" in
let exits = Term.default_exits in
Term.(const templateList ),
Term.info "TemplateList" ~doc ~exits
let deployStackHelp =
let doc = "Deploy a Stack to a Provider" in
let exits = Term.default_exits in
Term.(const deployStack $ deployArg $ templateArg $ providerArg ),
Term.info "DeployStack" ~doc ~exits
let deployRemoveHelp =
let doc = "Remove a deployed stack from a Provider" in
let exits = Term.default_exits in
Term.(const deployRemove $ deployArg $ templateArg $ providerArg ),
Term.info "DeployRemove" ~doc ~exits
(* Run *)
let actions = [templateCreateHelp; templateDetailsHelp; templateListHelp; deployStackHelp; deployRemoveHelp]
let () = Term.(exit @@ eval_choice oCommanderHelp actions)