Skip to content

Commit d8fde24

Browse files
committed
Возможность настроить параметры парсера/дампера yaml
1 parent 8fd7140 commit d8fde24

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

src/main/java/com/annimon/ownlang/modules/yaml/yaml_decode.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,34 @@
11
package com.annimon.ownlang.modules.yaml;
22

33
import com.annimon.ownlang.lib.*;
4+
import java.util.LinkedHashMap;
45
import java.util.List;
56
import java.util.Map;
7+
import org.yaml.snakeyaml.LoaderOptions;
68
import org.yaml.snakeyaml.Yaml;
79

810
public final class yaml_decode implements Function {
911

1012
@Override
1113
public Value execute(Value... args) {
12-
Arguments.check(1, args.length);
14+
Arguments.checkOrOr(1, 2, args.length);
1315
try {
1416
final String yamlRaw = args[0].asString();
15-
final Object root = new Yaml().load(yamlRaw);
17+
final LoaderOptions options = new LoaderOptions();
18+
if (args.length == 2 && args[1].type() == Types.MAP) {
19+
configure(options, ((MapValue) args[1]));
20+
}
21+
final Object root = new Yaml(options).load(yamlRaw);
1622
return process(root);
1723
} catch (Exception ex) {
1824
throw new RuntimeException("Error while parsing yaml", ex);
1925
}
2026
}
27+
28+
private void configure(LoaderOptions options, MapValue map) {
29+
map.ifPresent("allowDuplicateKeys", value ->
30+
options.setAllowDuplicateKeys(value.asInt() != 0));
31+
}
2132

2233
private Value process(Object obj) {
2334
if (obj instanceof Map) {
@@ -40,7 +51,7 @@ private Value process(Object obj) {
4051
}
4152

4253
private MapValue process(Map<Object, Object> map) {
43-
final MapValue result = new MapValue(map.size());
54+
final MapValue result = new MapValue(new LinkedHashMap<>(map.size()));
4455
for (Map.Entry<Object, Object> entry : map.entrySet()) {
4556
final String key = entry.getKey().toString();
4657
final Value value = process(entry.getValue());

src/main/java/com/annimon/ownlang/modules/yaml/yaml_encode.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,55 @@
55
import java.util.LinkedHashMap;
66
import java.util.List;
77
import java.util.Map;
8+
import org.yaml.snakeyaml.DumperOptions;
89
import org.yaml.snakeyaml.Yaml;
910

1011
public final class yaml_encode implements Function {
1112

1213
@Override
1314
public Value execute(Value... args) {
14-
Arguments.check(1, args.length);
15+
Arguments.checkOrOr(1, 2, args.length);
1516
try {
1617
final Object root = process(args[0]);
17-
final String yamlRaw = new Yaml().dump(root);
18+
final DumperOptions options = new DumperOptions();
19+
if (args.length == 2 && args[1].type() == Types.MAP) {
20+
configure(options, ((MapValue) args[1]));
21+
}
22+
final String yamlRaw = new Yaml(options).dump(root);
1823
return new StringValue(yamlRaw);
1924
} catch (Exception ex) {
2025
throw new RuntimeException("Error while creating yaml", ex);
2126
}
2227
}
28+
29+
private void configure(DumperOptions options, MapValue map) {
30+
map.ifPresent("allowReadOnlyProperties", value ->
31+
options.setAllowReadOnlyProperties(value.asInt() != 0));
32+
map.ifPresent("allowUnicode", value ->
33+
options.setAllowUnicode(value.asInt() != 0));
34+
map.ifPresent("canonical", value ->
35+
options.setCanonical(value.asInt() != 0));
36+
map.ifPresent("defaultFlowStyle", value ->
37+
options.setDefaultFlowStyle(DumperOptions.FlowStyle.valueOf(value.asString())));
38+
map.ifPresent("defaultScalarStyle", value ->
39+
options.setDefaultScalarStyle(DumperOptions.ScalarStyle.valueOf(value.asString())));
40+
map.ifPresent("explicitEnd", value ->
41+
options.setExplicitEnd(value.asInt() != 0));
42+
map.ifPresent("explicitStart", value ->
43+
options.setExplicitStart(value.asInt() != 0));
44+
map.ifPresent("indent", value ->
45+
options.setIndent(value.asInt()));
46+
map.ifPresent("indicatorIndent", value ->
47+
options.setIndicatorIndent(value.asInt()));
48+
map.ifPresent("lineBreak", value ->
49+
options.setLineBreak(DumperOptions.LineBreak.valueOf(value.asString())));
50+
map.ifPresent("prettyFlow", value ->
51+
options.setPrettyFlow(value.asInt() != 0));
52+
map.ifPresent("splitLines", value ->
53+
options.setSplitLines(value.asInt() != 0));
54+
map.ifPresent("width", value ->
55+
options.setWidth(value.asInt()));
56+
}
2357

2458
private Object process(Value val) {
2559
switch (val.type()) {

0 commit comments

Comments
 (0)