From d8fde244b0cfe62bc49114c1655ed725c7a01111 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 29 May 2019 23:29:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D1=8B=20=D0=BF=D0=B0=D1=80=D1=81=D0=B5=D1=80=D0=B0/?= =?UTF-8?q?=D0=B4=D0=B0=D0=BC=D0=BF=D0=B5=D1=80=D0=B0=20yaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ownlang/modules/yaml/yaml_decode.java | 17 +++++++-- .../ownlang/modules/yaml/yaml_encode.java | 38 ++++++++++++++++++- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/annimon/ownlang/modules/yaml/yaml_decode.java b/src/main/java/com/annimon/ownlang/modules/yaml/yaml_decode.java index 07e3f19..472b743 100644 --- a/src/main/java/com/annimon/ownlang/modules/yaml/yaml_decode.java +++ b/src/main/java/com/annimon/ownlang/modules/yaml/yaml_decode.java @@ -1,23 +1,34 @@ package com.annimon.ownlang.modules.yaml; import com.annimon.ownlang.lib.*; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.Yaml; public final class yaml_decode implements Function { @Override public Value execute(Value... args) { - Arguments.check(1, args.length); + Arguments.checkOrOr(1, 2, args.length); try { final String yamlRaw = args[0].asString(); - final Object root = new Yaml().load(yamlRaw); + final LoaderOptions options = new LoaderOptions(); + if (args.length == 2 && args[1].type() == Types.MAP) { + configure(options, ((MapValue) args[1])); + } + final Object root = new Yaml(options).load(yamlRaw); return process(root); } catch (Exception ex) { throw new RuntimeException("Error while parsing yaml", ex); } } + + private void configure(LoaderOptions options, MapValue map) { + map.ifPresent("allowDuplicateKeys", value -> + options.setAllowDuplicateKeys(value.asInt() != 0)); + } private Value process(Object obj) { if (obj instanceof Map) { @@ -40,7 +51,7 @@ public final class yaml_decode implements Function { } private MapValue process(Map map) { - final MapValue result = new MapValue(map.size()); + final MapValue result = new MapValue(new LinkedHashMap<>(map.size())); for (Map.Entry entry : map.entrySet()) { final String key = entry.getKey().toString(); final Value value = process(entry.getValue()); diff --git a/src/main/java/com/annimon/ownlang/modules/yaml/yaml_encode.java b/src/main/java/com/annimon/ownlang/modules/yaml/yaml_encode.java index 2620c9b..5b30a22 100644 --- a/src/main/java/com/annimon/ownlang/modules/yaml/yaml_encode.java +++ b/src/main/java/com/annimon/ownlang/modules/yaml/yaml_encode.java @@ -5,21 +5,55 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; public final class yaml_encode implements Function { @Override public Value execute(Value... args) { - Arguments.check(1, args.length); + Arguments.checkOrOr(1, 2, args.length); try { final Object root = process(args[0]); - final String yamlRaw = new Yaml().dump(root); + final DumperOptions options = new DumperOptions(); + if (args.length == 2 && args[1].type() == Types.MAP) { + configure(options, ((MapValue) args[1])); + } + final String yamlRaw = new Yaml(options).dump(root); return new StringValue(yamlRaw); } catch (Exception ex) { throw new RuntimeException("Error while creating yaml", ex); } } + + private void configure(DumperOptions options, MapValue map) { + map.ifPresent("allowReadOnlyProperties", value -> + options.setAllowReadOnlyProperties(value.asInt() != 0)); + map.ifPresent("allowUnicode", value -> + options.setAllowUnicode(value.asInt() != 0)); + map.ifPresent("canonical", value -> + options.setCanonical(value.asInt() != 0)); + map.ifPresent("defaultFlowStyle", value -> + options.setDefaultFlowStyle(DumperOptions.FlowStyle.valueOf(value.asString()))); + map.ifPresent("defaultScalarStyle", value -> + options.setDefaultScalarStyle(DumperOptions.ScalarStyle.valueOf(value.asString()))); + map.ifPresent("explicitEnd", value -> + options.setExplicitEnd(value.asInt() != 0)); + map.ifPresent("explicitStart", value -> + options.setExplicitStart(value.asInt() != 0)); + map.ifPresent("indent", value -> + options.setIndent(value.asInt())); + map.ifPresent("indicatorIndent", value -> + options.setIndicatorIndent(value.asInt())); + map.ifPresent("lineBreak", value -> + options.setLineBreak(DumperOptions.LineBreak.valueOf(value.asString()))); + map.ifPresent("prettyFlow", value -> + options.setPrettyFlow(value.asInt() != 0)); + map.ifPresent("splitLines", value -> + options.setSplitLines(value.asInt() != 0)); + map.ifPresent("width", value -> + options.setWidth(value.asInt())); + } private Object process(Value val) { switch (val.type()) {