let version = "1.0.0"; module Commands = { let use = version => Lwt_main.run(Use.run(version)); let listRemote = () => Lwt_main.run(ListRemote.run()); let listLocal = () => Lwt_main.run(ListLocal.run()); let install = version => Lwt_main.run(Install.run(~version)); let env = isFishShell => Lwt_main.run(Env.run(isFishShell)); }; open Cmdliner; let help_secs = [ `S(Manpage.s_common_options), `S(Manpage.s_environment), `P("These options are common to all commands."), `S("MORE HELP"), `P("Use `$(mname) $(i,COMMAND) --help' for help on a single command."), `Noblank, `S(Manpage.s_bugs), `P("File bug reports at https://github.com/Schniz/fnm"), ]; let envs = [ Term.env_info( ~doc= "The root directory of fnm installations. Defaults to: " ++ Fnm.Directories.sfwRoot, "FNM_DIR", ), ]; let install = { let doc = "Install another node version"; let man = []; let selectedVersion = { let doc = "Install another version specified in $(docv)."; Arg.( value & pos(0, some(string), None) & info([], ~docv="VERSION", ~doc) ); }; ( Term.(const(Commands.install) $ selectedVersion), Term.info("install", ~version, ~doc, ~exits=Term.default_exits, ~man), ); }; let listLocal = { let doc = "List all the installed versions"; let man = []; ( Term.(app(const(Commands.listLocal), const())), Term.info("ls", ~version, ~doc, ~exits=Term.default_exits, ~man), ); }; let listRemote = { let doc = "List all the versions upstream"; let man = []; ( Term.(app(const(Commands.listRemote), const())), Term.info("ls-remote", ~version, ~doc, ~exits=Term.default_exits, ~man), ); }; let use = { let doc = "Switch to another installed node version"; let man = []; let selectedVersion = { let doc = "Switch to version $(docv).\nLeave empty to look for value from `.nvmrc`"; Arg.( value & pos(0, some(string), None) & info([], ~docv="VERSION", ~doc) ); }; ( Term.(const(Commands.use) $ selectedVersion), Term.info("use", ~version, ~doc, ~exits=Term.default_exits, ~man), ); }; let env = { let doc = "Show env configurations"; let sdocs = Manpage.s_common_options; let man = help_secs; let isFishShell = { let doc = "Output an env configuration for fish shell."; Arg.( value & flag & info(["fish"], ~doc) ); }; ( Term.(const(Commands.env) $ isFishShell), Term.info("env", ~version, ~doc, ~exits=Term.default_exits, ~man, ~sdocs), ); }; let defaultCmd = { let doc = "Manage Node.js installations"; let sdocs = Manpage.s_common_options; let man = help_secs; ( Term.(ret(const(_ => `Help((`Pager, None))) $ const())), Term.info( "fnm", ~envs, ~version, ~doc, ~exits=Term.default_exits, ~man, ~sdocs, ), ); }; let _ = Term.eval_choice(defaultCmd, [install, use, listLocal, listRemote, env]) |> Term.exit;