Files
tai/taicpp/tests/cli_driver.cpp
T

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;
}