Skip to content

Commit a790253

Browse files
dfleury2David Fleuryhenryiii
authored
fix: add multilines array support for TOML (#528)
* Adds multilines array support * Update include/CLI/Config.hpp Co-authored-by: David Fleury <[email protected]> Co-authored-by: Henry Schreiner <[email protected]>
1 parent 69674dc commit a790253

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

include/CLI/Config.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,11 @@ inline std::vector<ConfigItem> ConfigBase::from_config(std::istream &input) cons
211211
if(pos != std::string::npos) {
212212
name = detail::trim_copy(line.substr(0, pos));
213213
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+
}
215219
items_buffer = detail::split_up(item.substr(1, item.length() - 2), aSep);
216220
} else if((isDefaultArray || isINIArray) && item.find_first_of(aSep) != std::string::npos) {
217221
items_buffer = detail::split_up(item, aSep);

tests/ConfigFileTest.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,47 @@ TEST(StringBased, Vector) {
150150
EXPECT_EQ("seven", output.at(2).inputs.at(2));
151151
}
152152

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+
153194
TEST(StringBased, Spaces) {
154195
std::stringstream ofile;
155196

0 commit comments

Comments
 (0)