Commit a7902531c97ccdc874a7e21c9d13f94dec790ec6
Committed by
GitHub
1 parent
69674dc9
fix: add multilines array support for TOML (#528)
* Adds multilines array support * Update include/CLI/Config.hpp Co-authored-by: David Fleury <david.fleury@expandium.com> Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
Showing
2 changed files
with
46 additions
and
1 deletions
include/CLI/Config.hpp
| @@ -211,7 +211,11 @@ inline std::vector<ConfigItem> ConfigBase::from_config(std::istream &input) cons | @@ -211,7 +211,11 @@ inline std::vector<ConfigItem> ConfigBase::from_config(std::istream &input) cons | ||
| 211 | if(pos != std::string::npos) { | 211 | if(pos != std::string::npos) { |
| 212 | name = detail::trim_copy(line.substr(0, pos)); | 212 | name = detail::trim_copy(line.substr(0, pos)); |
| 213 | std::string item = detail::trim_copy(line.substr(pos + 1)); | 213 | std::string item = detail::trim_copy(line.substr(pos + 1)); |
| 214 | - if(item.size() > 1 && item.front() == aStart && item.back() == aEnd) { | 214 | + if(item.size() > 1 && item.front() == aStart) { |
| 215 | + for(std::string multiline; item.back() != aEnd && std::getline(input, multiline);) { | ||
| 216 | + detail::trim(multiline); | ||
| 217 | + item += multiline; | ||
| 218 | + } | ||
| 215 | items_buffer = detail::split_up(item.substr(1, item.length() - 2), aSep); | 219 | items_buffer = detail::split_up(item.substr(1, item.length() - 2), aSep); |
| 216 | } else if((isDefaultArray || isINIArray) && item.find_first_of(aSep) != std::string::npos) { | 220 | } else if((isDefaultArray || isINIArray) && item.find_first_of(aSep) != std::string::npos) { |
| 217 | items_buffer = detail::split_up(item, aSep); | 221 | items_buffer = detail::split_up(item, aSep); |
tests/ConfigFileTest.cpp
| @@ -150,6 +150,47 @@ TEST(StringBased, Vector) { | @@ -150,6 +150,47 @@ TEST(StringBased, Vector) { | ||
| 150 | EXPECT_EQ("seven", output.at(2).inputs.at(2)); | 150 | EXPECT_EQ("seven", output.at(2).inputs.at(2)); |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | +TEST(StringBased, TomlVector) { | ||
| 154 | + std::stringstream ofile; | ||
| 155 | + | ||
| 156 | + ofile << "one = [three]\n"; | ||
| 157 | + ofile << "two = [four]\n"; | ||
| 158 | + ofile << "five = [six, and, seven]\n"; | ||
| 159 | + ofile << "eight = [nine, \n" | ||
| 160 | + "ten, eleven, twelve \n" | ||
| 161 | + "]\n"; | ||
| 162 | + ofile << "one_more = [one, \n" | ||
| 163 | + "two, three ] \n"; | ||
| 164 | + | ||
| 165 | + ofile.seekg(0, std::ios::beg); | ||
| 166 | + | ||
| 167 | + std::vector<CLI::ConfigItem> output = CLI::ConfigINI().from_config(ofile); | ||
| 168 | + | ||
| 169 | + EXPECT_EQ(5u, output.size()); | ||
| 170 | + EXPECT_EQ("one", output.at(0).name); | ||
| 171 | + EXPECT_EQ(1u, output.at(0).inputs.size()); | ||
| 172 | + EXPECT_EQ("three", output.at(0).inputs.at(0)); | ||
| 173 | + EXPECT_EQ("two", output.at(1).name); | ||
| 174 | + EXPECT_EQ(1u, output.at(1).inputs.size()); | ||
| 175 | + EXPECT_EQ("four", output.at(1).inputs.at(0)); | ||
| 176 | + EXPECT_EQ("five", output.at(2).name); | ||
| 177 | + EXPECT_EQ(3u, output.at(2).inputs.size()); | ||
| 178 | + EXPECT_EQ("six", output.at(2).inputs.at(0)); | ||
| 179 | + EXPECT_EQ("and", output.at(2).inputs.at(1)); | ||
| 180 | + EXPECT_EQ("seven", output.at(2).inputs.at(2)); | ||
| 181 | + EXPECT_EQ("eight", output.at(3).name); | ||
| 182 | + EXPECT_EQ(4u, output.at(3).inputs.size()); | ||
| 183 | + EXPECT_EQ("nine", output.at(3).inputs.at(0)); | ||
| 184 | + EXPECT_EQ("ten", output.at(3).inputs.at(1)); | ||
| 185 | + EXPECT_EQ("eleven", output.at(3).inputs.at(2)); | ||
| 186 | + EXPECT_EQ("twelve", output.at(3).inputs.at(3)); | ||
| 187 | + EXPECT_EQ("one_more", output.at(4).name); | ||
| 188 | + EXPECT_EQ(3u, output.at(4).inputs.size()); | ||
| 189 | + EXPECT_EQ("one", output.at(4).inputs.at(0)); | ||
| 190 | + EXPECT_EQ("two", output.at(4).inputs.at(1)); | ||
| 191 | + EXPECT_EQ("three", output.at(4).inputs.at(2)); | ||
| 192 | +} | ||
| 193 | + | ||
| 153 | TEST(StringBased, Spaces) { | 194 | TEST(StringBased, Spaces) { |
| 154 | std::stringstream ofile; | 195 | std::stringstream ofile; |
| 155 | 196 |