blob: 5f8d67284fdd53a1f260d702eff6ce563b18a342 [file] [log] [blame] [edit]
#ifndef GOLDENS_ARGUMENTS_HPP
#define GOLDENS_ARGUMENTS_HPP
#include <iostream>
#include <memory>
#include <string>
#include "args.hxx"
class GoldensArguments
{
public:
void parse(int argc, const char* const* argv)
{
m_parser = std::make_unique<args::ArgumentParser>(
"Reads a .riv file, and optional artboard and state machine names, "
"and generates the corresponding png grid image, "
"storing it in (output).");
args::HelpFlag help(*m_parser,
"help",
"Display this help menu",
{'h', "help"});
args::Group required(*m_parser,
"required arguments:",
args::Group::Validators::All);
args::Group optional(*m_parser,
"optional arguments:",
args::Group::Validators::DontCare);
args::ValueFlag<std::string> src(
optional,
"src",
"source src filename (ignored if --test_harness)",
{'s', "src"});
args::ValueFlag<std::string> testHarness(
optional,
"test_harness",
"TCP server address of python test harness",
{"test_harness"});
// no default for windows because /dev/null isnt a thing
args::ValueFlag<std::string> output(
optional,
"output",
"output png directory (ignored if --test_harness)",
{'o', "output"});
args::ValueFlag<std::string> artboard(
optional,
"artboard",
"artboard to draw from (only when src != '-')",
{'t', "artboard"});
args::ValueFlag<std::string> stateMachine(
optional,
"name",
"state machine to be played (only when src != '-')",
{'S', "stateMachine"});
args::ValueFlag<std::string> backend(
optional,
"backend",
"backend type: [gl, metal, angle_gl, angle_d3d, "
"angle_vk, angle_mtl, coregraphics, skia, rhi]",
{'b', "backend"});
args::Flag headless(optional,
"headless",
"perform rendering in an offscreen context",
{'d', "headless"});
args::Flag fastPNG(optional,
"fastPNG",
"favor speed over space when compressing pngs",
{'f', "fast-png"});
args::Flag interactive(optional,
"interactive",
"leave the window open for user interaction",
{'i', "interactive"});
args::Flag verbose(optional,
"verbose",
"verbose output",
{'v', "verbose"});
args::ValueFlag<int> rows(optional,
"int",
"number of rows in the grid",
{'r', "rows"});
args::ValueFlag<int> cols(optional,
"int",
"number of columns in the grid",
{'c', "cols"});
args::ValueFlag<int> pngThreads(optional,
"int",
"number of PNG encode threads",
{'p', "png_threads"},
2);
args::CompletionFlag completion(*m_parser, {"complete"});
try
{
m_parser->ParseCLI(argc, argv);
}
catch (const std::invalid_argument e)
{
std::cout << e.what();
throw;
}
catch (const args::Completion& e)
{
std::cout << e.what();
throw;
}
catch (const args::Help&)
{
std::cout << *m_parser;
throw;
}
catch (const args::ParseError& e)
{
std::cerr << e.what() << std::endl;
std::cerr << *m_parser;
throw;
}
catch (args::ValidationError e)
{
std::cerr << e.what() << std::endl;
std::cerr << *m_parser;
throw;
}
m_testHarness = args::get(testHarness);
m_src = args::get(src);
m_output = args::get(output);
m_artboard = args::get(artboard);
m_stateMachine = args::get(stateMachine);
m_backend = args::get(backend);
m_headless = args::get(headless);
m_fastPNG = args::get(fastPNG);
m_interactive = args::get(interactive);
m_verbose = args::get(verbose);
m_rows = std::max(args::get(rows), 1);
m_cols = std::max(args::get(cols), 1);
m_pngThreads = std::max(args::get(pngThreads), 1);
}
const std::string& testHarness() const { return m_testHarness; }
const std::string& src() const { return m_src; }
const std::string& output() const { return m_output; }
const std::string& artboard() const { return m_artboard; }
const std::string& stateMachine() const { return m_stateMachine; }
const std::string& backend() const { return m_backend; }
bool headless() const { return m_headless; }
bool fastPNG() const { return m_fastPNG; }
bool interactive() const { return m_interactive; }
bool verbose() const { return m_verbose; }
int rows() const { return m_rows; }
int cols() const { return m_cols; }
int pngThreads() const { return m_pngThreads; }
private:
std::unique_ptr<args::ArgumentParser> m_parser;
std::string m_testHarness;
std::string m_src;
std::string m_output;
std::string m_artboard;
std::string m_stateMachine;
std::string m_backend;
std::string m_pngServer;
bool m_headless;
bool m_fastPNG;
bool m_interactive;
bool m_verbose;
int m_rows;
int m_cols;
int m_pngThreads;
};
#endif