// 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 #include #include #include #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(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(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 args(argv + 1, argv + argc); const ParseOutcome r = ArgParser{}.parse(args); std::vector> 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; }