CLI11 icon indicating copy to clipboard operation
CLI11 copied to clipboard

AsNumberWithUnit fails with error-message

Open steffenb7333 opened this issue 5 years ago • 1 comments

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.

steffenb7333 avatar Jun 23 '20 09:06 steffenb7333

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.

phlptp avatar Jul 28 '20 14:07 phlptp