Skip to content

Commit 73657eb

Browse files
authored
Merge pull request #234 from SentryMan/yml
Fix Colon Yml List parsing
2 parents e751aa1 + bab3b8f commit 73657eb

File tree

3 files changed

+29
-13
lines changed

3 files changed

+29
-13
lines changed

avaje-config/src/main/java/io/avaje/config/YamlLoaderSimple.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,9 @@ private void processMultiLine(String line) {
120120
}
121121

122122
private void multiLineEnd(String line) {
123-
if (state == State.MultiLine) addKeyVal(multiLineValue());
124-
else {
123+
if (state == State.MultiLine) {
124+
addKeyVal(multiLineValue());
125+
} else {
125126
addKeyVal(listValue());
126127
}
127128
processNext(line);
@@ -170,9 +171,8 @@ private void multiLineTrimTrailing() {
170171
for (int i = multiLines.size(); i-- > 0; ) {
171172
if (!multiLines.get(i).trim().isEmpty()) {
172173
break;
173-
} else {
174-
multiLines.remove(i);
175174
}
175+
multiLines.remove(i);
176176
}
177177
}
178178

@@ -186,9 +186,10 @@ private void processNext(String line) {
186186
}
187187

188188
final int pos = line.indexOf(':');
189-
if (pos == -1) {
189+
var list = line.stripLeading().charAt(0) == '-';
190+
if (pos == -1 || list) {
190191
// value on another line
191-
processNonKey(line);
192+
processNonKey(line, list);
192193
return;
193194
}
194195
if (state == State.RequireTopKey && currentIndent > 0) {
@@ -241,7 +242,7 @@ private void addKeyVal(String value) {
241242
state = State.RequireKey;
242243
}
243244

244-
private void processNonKey(String line) {
245+
private void processNonKey(String line, boolean list) {
245246
if (state == State.RequireKey) {
246247
state = State.RequireTopKey;
247248
// drop this value line
@@ -254,7 +255,7 @@ private void processNonKey(String line) {
254255
if (currentIndent <= keyIndent) {
255256
throw new IllegalStateException("Value not indented enough for key " + fullKey() + " at line: " + currentLine + " line[" + line + "]");
256257
}
257-
if (line.stripLeading().charAt(0) == '-') {
258+
if (list) {
258259
listStart(MultiLineTrim.Implicit);
259260
} else {
260261
multilineStart(MultiLineTrim.Implicit);
@@ -326,9 +327,8 @@ private void popKeys(int indent) {
326327
while (!keyStack.isEmpty()) {
327328
if (keyStack.peek().indent() < indent) {
328329
break;
329-
} else {
330-
keyStack.pop();
331330
}
331+
keyStack.pop();
332332
}
333333
}
334334

avaje-config/src/test/java/io/avaje/config/YamlParserTest.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package io.avaje.config;
22

3-
import org.junit.jupiter.api.Test;
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
45

56
import java.io.InputStream;
67
import java.util.Map;
78

8-
import static org.assertj.core.api.Assertions.assertThat;
9-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
9+
import org.junit.jupiter.api.Test;
1010

1111
class YamlParserTest {
1212

@@ -196,6 +196,17 @@ void parse_err_req_key2() {
196196
.hasMessageContaining("line:5");
197197
}
198198

199+
@Test
200+
void parse_list() {
201+
var list =
202+
Map.of(
203+
"keyValueList",
204+
"apple:10,pear:15,cheese:10",
205+
"keyValueList1",
206+
"apple:10,pear:15,cheese:10");
207+
assertThat(parseYaml2("/yaml/list.yaml")).isEqualTo(list);
208+
assertThat(parseYaml("/yaml/list.yaml")).isEqualTo(list);
209+
}
199210

200211
private Map<String, String> parseYaml2(String s) {
201212
return load.load(res(s));
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
keyValueList: apple:10,pear:15,cheese:10
2+
keyValueList1:
3+
- apple:10
4+
- pear:15
5+
- cheese:10

0 commit comments

Comments
 (0)