Commit a7902531c97ccdc874a7e21c9d13f94dec790ec6

Authored by D. Fleury
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>
include/CLI/Config.hpp
@@ -211,7 +211,11 @@ inline std::vector&lt;ConfigItem&gt; ConfigBase::from_config(std::istream &amp;input) cons @@ -211,7 +211,11 @@ inline std::vector&lt;ConfigItem&gt; ConfigBase::from_config(std::istream &amp;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