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 | 211 | if(pos != std::string::npos) { |
| 212 | 212 | name = detail::trim_copy(line.substr(0, pos)); |
| 213 | 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 | 219 | items_buffer = detail::split_up(item.substr(1, item.length() - 2), aSep); |
| 216 | 220 | } else if((isDefaultArray || isINIArray) && item.find_first_of(aSep) != std::string::npos) { |
| 217 | 221 | items_buffer = detail::split_up(item, aSep); | ... | ... |
tests/ConfigFileTest.cpp
| ... | ... | @@ -150,6 +150,47 @@ TEST(StringBased, Vector) { |
| 150 | 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 | 194 | TEST(StringBased, Spaces) { |
| 154 | 195 | std::stringstream ofile; |
| 155 | 196 | ... | ... |