1
0
mirror of https://github.com/CLIUtils/CLI11.git synced 2025-05-03 05:53:52 +00:00

Add quotes to values containing spaces (#198)

* Add test case for INI output of defaulted options

* Add quotes to values with spaces

* Fixing formatting

* Only fix quote strings, not vectors
This commit is contained in:
ncihnegn 2019-01-19 03:25:00 -08:00 committed by Henry Schreiner
parent bd67a953b2
commit 9cfa0f44a0
3 changed files with 33 additions and 1 deletions

View File

@ -54,7 +54,12 @@ ConfigINI::to_config(const App *app, bool default_also, bool write_description,
}
out << "; " << detail::fix_newlines("; ", opt->get_description()) << std::endl;
}
// Don't try to quote anything that is not size 1
if(opt->get_items_expected() != 1)
out << name << "=" << value << std::endl;
else
out << name << "=" << detail::add_quotes_if_needed(value) << std::endl;
}
}
}

View File

@ -250,5 +250,17 @@ inline size_t escape_detect(std::string &str, size_t offset) {
return offset + 1;
}
/// Add quotes if the string contains spaces
inline std::string &add_quotes_if_needed(std::string &str) {
if((str.front() != '"' && str.front() != '\'') || str.front() != str.back()) {
char quote = str.find('"') < str.find('\'') ? '\'' : '"';
if(str.find(' ') != std::string::npos) {
str.insert(0, 1, quote);
str.append(1, quote);
}
}
return str;
}
} // namespace detail
} // namespace CLI

View File

@ -768,3 +768,18 @@ TEST_F(TApp, IniQuotedOutput) {
EXPECT_THAT(str, HasSubstr("val1=\"I am a string\""));
EXPECT_THAT(str, HasSubstr("val2='I am a \"confusing\" string'"));
}
TEST_F(TApp, DefaultsIniQuotedOutput) {
std::string val1{"I am a string"};
app.add_option("--val1", val1, "", true);
std::string val2{R"(I am a "confusing" string)"};
app.add_option("--val2", val2, "", true);
run();
std::string str = app.config_to_str(true);
EXPECT_THAT(str, HasSubstr("val1=\"I am a string\""));
EXPECT_THAT(str, HasSubstr("val2='I am a \"confusing\" string'"));
}