CLI11
CLI11 copied to clipboard
AsNumberWithUnit fails with error-message
Given
using namespace std::literals;
auto duration = 1s;
CLI::App app;
app.option_defaults()->ignore_case();
app.add_option_function<std::size_t>("--duration", [&](auto&& a_value){ duration = std::chrono::seconds{a_value}; }, "valid units: sec, min, h, day.")->capture_default_str()->check(CLI::AsNumberWithUnit(std::map<std::string, std::size_t>{{"sec", 1}, {"min", 60}, {"h", 3600},{"day", 24*3600}}));
app.parse(std::vector{"1 day"s, "--duration"s});
app.parse throws an exception with message "Could not convert: --duration = 1 day" and I have simply no idea why.
Sorry for taking so long on this.
Please use
using namespace std::literals;
auto duration = 1s;
CLI::App app;
app.option_defaults()->ignore_case();
app.add_option_function<std::size_t>("--duration", [&](auto&& a_value){ duration = std::chrono::seconds{a_value}; }, "valid units: sec, min, h, day.")->capture_default_str()->transform(CLI::AsNumberWithUnit(std::map<std::string, std::size_t>{{"sec", 1}, {"min", 60}, {"h", 3600},{"day", 24*3600}}));
app.parse(std::vector{"1 day"s, "--duration"s});
You need to use transform instead of check for the validator. check doesn't do any modification of the string so it is trying to convert "1 day" into a size_t and failing. whereas transform would modify the string according to the map.