cli: faithful argparse port (single flag table, HelpFormatter, textwrap, abbreviations, usage on error)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
// Parse-only driver for tests/cli_parity.py: behaves like detz for errors and -h, and for a
|
||||
// successful parse prints the argparse Namespace as sorted JSON (see docs/cli.md, Tests).
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "../src/cli/arg_parser.h"
|
||||
#include "../src/cli/cli.h"
|
||||
using namespace detz::cli;
|
||||
namespace {
|
||||
std::string jstr(const std::string& s) {
|
||||
std::string o = "\"";
|
||||
for (unsigned char c : s) {
|
||||
if (c == '"' || c == '\\') { o += '\\'; o += static_cast<char>(c); }
|
||||
else if (c == '\n') o += "\\n";
|
||||
else if (c < 0x20) { char b[8]; std::snprintf(b, sizeof b, "\\u%04x", c); o += b; }
|
||||
else o += static_cast<char>(c);
|
||||
}
|
||||
return o + "\"";
|
||||
}
|
||||
} // namespace
|
||||
int main(int argc, char** argv) {
|
||||
Command cmd = Parser().parse(argc, argv);
|
||||
if (!cmd.opts.error.empty() || cmd.opts.help) return cmd.run();
|
||||
std::vector<std::string> args(argv + 1, argv + argc);
|
||||
const ParseOutcome r = ArgParser{}.parse(args);
|
||||
std::vector<std::pair<std::string, std::string>> kv;
|
||||
for (auto& [k, v] : r.ns.flags) kv.push_back({k, v ? "true" : "false"});
|
||||
for (auto& [k, v] : r.ns.strings) kv.push_back({k, jstr(v)});
|
||||
for (auto& [k, v] : r.ns.numbers) kv.push_back({k, std::to_string(v)});
|
||||
for (auto& [k, v] : r.ns.lists) {
|
||||
if (k == "prompt" && v.empty()) continue;
|
||||
std::string l = "[";
|
||||
for (size_t i = 0; i < v.size(); ++i) { if (i) l += ", "; l += jstr(v[i]); }
|
||||
kv.push_back({k, l + "]"});
|
||||
}
|
||||
std::sort(kv.begin(), kv.end());
|
||||
std::string out = "{";
|
||||
for (size_t i = 0; i < kv.size(); ++i) { if (i) out += ", "; out += jstr(kv[i].first) + ": " + kv[i].second; }
|
||||
std::puts((out + "}").c_str());
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user