43 lines
1.7 KiB
C++
43 lines
1.7 KiB
C++
// 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;
|
|
}
|