diff --git a/include/CLI/App.hpp b/include/CLI/App.hpp index 816969d..64ee292 100644 --- a/include/CLI/App.hpp +++ b/include/CLI/App.hpp @@ -809,35 +809,46 @@ class App { /// Produce a string that could be read in as a config of the current values of the App. Set default_also to include /// default arguments. Prefix will add a string to the beginning of each option. - std::string config_to_str(bool default_also = false, std::string prefix = "") const { + std::string config_to_str(bool default_also = false, std::string prefix = "", bool write_description = false) const { std::stringstream out; for(const Option_p &opt : options_) { // Only process option with a long-name and configurable if(!opt->lnames_.empty() && opt->get_configurable()) { std::string name = prefix + opt->lnames_[0]; + std::string value; // Non-flags if(opt->get_expected() != 0) { // If the option was found on command line if(opt->count() > 0) - out << name << "=" << detail::inijoin(opt->results()) << std::endl; + value = detail::inijoin(opt->results()); // If the option has a default and is requested by optional argument else if(default_also && !opt->defaultval_.empty()) - out << name << "=" << opt->defaultval_ << std::endl; + value = opt->defaultval_; // Flag, one passed } else if(opt->count() == 1) { - out << name << "=true" << std::endl; + value = "true"; // Flag, multiple passed } else if(opt->count() > 1) { - out << name << "=" << opt->count() << std::endl; + value = std::to_string(opt->count()); // Flag, not present } else if(opt->count() == 0 && default_also) { - out << name << "=false" << std::endl; + value = "false"; + } + + if (value.size() != 0) { + if (write_description and opt->description_.size() != 0) { + if (out.tellp() != 0) { + out << std::endl; + } + out << "; " << opt->description_ << std::endl; + } + out << name << "=" << value << std::endl; } } } diff --git a/tests/IniTest.cpp b/tests/IniTest.cpp index 1e032cc..53d7062 100644 --- a/tests/IniTest.cpp +++ b/tests/IniTest.cpp @@ -575,6 +575,31 @@ TEST_F(TApp, IniOutputNoConfigurable) { EXPECT_EQ("simple=3\n", str); } +TEST_F(TApp, IniOutputShortSingleDescription) { + std::string flag = "some_flag"; + std::string description = "Some short description."; + app.add_flag("--" + flag, description); + + run(); + + std::string str = app.config_to_str(true, "", true); + EXPECT_THAT(str, HasSubstr("; " + description + "\n" + flag + "=false\n")); +} + +TEST_F(TApp, IniOutputShortDoubleDescription) { + std::string flag1 = "flagnr1"; + std::string flag2 = "flagnr2"; + std::string description1 = "First description."; + std::string description2 = "Second description."; + app.add_flag("--" + flag1, description1); + app.add_flag("--" + flag2, description2); + + run(); + + std::string str = app.config_to_str(true, "", true); + EXPECT_EQ(str, "; " + description1 + "\n" + flag1 + "=false\n\n; " + description2 + "\n" + flag2 + "=false\n"); +} + TEST_F(TApp, IniOutputVector) { std::vector v;