(argv: string[])
| 58 | } |
| 59 | |
| 60 | export function parseCommandArgv(argv: string[]): ParsedCliCommand | null { |
| 61 | if (!argv.length) return null; |
| 62 | const root = (argv[0] ?? "").trim().toLowerCase(); |
| 63 | if (!root || root.startsWith("-")) return null; |
| 64 | if (!ROOT_COMMANDS.has(root)) return null; |
| 65 | |
| 66 | if (root === "help") { |
| 67 | return parseHelpCommand(argv.slice(1)); |
| 68 | } |
| 69 | if (root === "doctor") { |
| 70 | const bag = parseOptionBag(argv.slice(1)); |
| 71 | assertAllowedOptions(bag.options, GLOBAL_OPTION_NAMES); |
| 72 | const common = parseCommonOptions(bag.options); |
| 73 | return { kind: "doctor", ...common }; |
| 74 | } |
| 75 | |
| 76 | if (argv.length < 2) { |
| 77 | throw new CommandParseError(`Missing action for command '${root}'`); |
| 78 | } |
| 79 | const action = (argv[1] ?? "").trim().toLowerCase(); |
| 80 | const bag = parseOptionBag(argv.slice(2)); |
| 81 | const common = parseCommonOptions(bag.options); |
| 82 | |
| 83 | if (common.help) { |
| 84 | return { |
| 85 | kind: "help", |
| 86 | topic: `${root} ${action}`.trim(), |
| 87 | ...common, |
| 88 | }; |
| 89 | } |
| 90 | |
| 91 | switch (root) { |
| 92 | case "exchange": |
| 93 | return parseExchangeCommand(action, bag.options, common); |
| 94 | case "market": |
| 95 | return parseMarketCommand(action, bag.options, common); |
| 96 | case "account": |
| 97 | return parseAccountCommand(action, bag.options, common); |
| 98 | case "position": |
| 99 | return parsePositionCommand(action, bag.options, common); |
| 100 | case "order": |
| 101 | return parseOrderCommand(action, bag.options, common); |
| 102 | case "strategy": |
| 103 | return parseStrategyCommand(action, bag, common); |
| 104 | default: |
| 105 | throw new CommandParseError(`Unsupported root command '${root}'`); |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | export function printCommandHelp(topic?: string): void { |
| 110 | if (!topic) { |
no test coverage detected