From 8d741c5e49a9234e712af41c7fa23c589abeecd2 Mon Sep 17 00:00:00 2001 From: JFronny Date: Thu, 21 Sep 2023 19:28:17 +0200 Subject: [PATCH] feat(muscript): IOLib from respackopts --- build.gradle.kts | 2 +- .../jfronny/muscript/gson/test/JsonTest.java | 2 +- .../muscript/data/dynamic/Dynamic.java | 2 +- .../gitlab/jfronny/muscript/libs/IOLib.java | 27 +++++++++ .../jfronny/muscript/libs/IOWrapper.java | 56 +++++++++++++++++++ .../muscript/{ => libs}/StandardLib.java | 2 +- muscript/src/main/java/module-info.java | 1 + .../muscript/test/MultiScriptTest.java | 2 +- .../jfronny/muscript/test/StackTraceTest.java | 2 +- .../muscript/test/ValidExampleTest.java | 2 +- .../muscript/test/util/MuTestUtil.java | 2 +- 11 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 muscript/src/main/java/io/gitlab/jfronny/muscript/libs/IOLib.java create mode 100644 muscript/src/main/java/io/gitlab/jfronny/muscript/libs/IOWrapper.java rename muscript/src/main/java/io/gitlab/jfronny/muscript/{ => libs}/StandardLib.java (99%) diff --git a/build.gradle.kts b/build.gradle.kts index cb986ff..f686431 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1 +1 @@ -version = "1.4-SNAPSHOT" \ No newline at end of file +version = "1.5-SNAPSHOT" \ No newline at end of file diff --git a/muscript-gson/src/test/java/io/gitlab/jfronny/muscript/gson/test/JsonTest.java b/muscript-gson/src/test/java/io/gitlab/jfronny/muscript/gson/test/JsonTest.java index b1d9d07..f2be5c7 100644 --- a/muscript-gson/src/test/java/io/gitlab/jfronny/muscript/gson/test/JsonTest.java +++ b/muscript-gson/src/test/java/io/gitlab/jfronny/muscript/gson/test/JsonTest.java @@ -1,7 +1,7 @@ package io.gitlab.jfronny.muscript.gson.test; import io.gitlab.jfronny.commons.serialize.gson.api.v2.GsonHolders; -import io.gitlab.jfronny.muscript.StandardLib; +import io.gitlab.jfronny.muscript.libs.StandardLib; import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/Dynamic.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/Dynamic.java index 7b79c2b..b5c09f3 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/Dynamic.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/Dynamic.java @@ -1,7 +1,7 @@ package io.gitlab.jfronny.muscript.data.dynamic; import io.gitlab.jfronny.commons.StringFormatter; -import io.gitlab.jfronny.muscript.StandardLib; +import io.gitlab.jfronny.muscript.libs.StandardLib; import io.gitlab.jfronny.muscript.ast.DynamicExpr; import io.gitlab.jfronny.muscript.ast.Expr; import io.gitlab.jfronny.muscript.compiler.ExprWriter; diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/libs/IOLib.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/libs/IOLib.java new file mode 100644 index 0000000..6bb77b4 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/libs/IOLib.java @@ -0,0 +1,27 @@ +package io.gitlab.jfronny.muscript.libs; + +import io.gitlab.jfronny.muscript.compiler.MuScriptVersion; +import io.gitlab.jfronny.muscript.data.Scope; +import io.gitlab.jfronny.muscript.data.Script; +import io.gitlab.jfronny.muscript.data.dynamic.DList; +import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; +import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal; + +import java.util.List; + +public class IOLib { + public static void addTo(MuScriptVersion version, Scope scope, IOWrapper io) { + if (version.contains(MuScriptVersion.V3)) { + scope.set("readString", args -> { + if (args.size() != 1) throw new IllegalArgumentException("Invalid number of arguments for readString: expected 1 but got " + args.size()); + return DFinal.of(io.readString(args.get(0).asString().getValue())); + }).set("runScript", args -> { + if (args.isEmpty()) throw new IllegalArgumentException("Invalid number of arguments for evaluateScript: expected 1 or more but got " + args.size()); + Script script = io.parseScript(args.get(0).asString().getValue()); + List l = args.getValue(); + DList innerArgs = DFinal.of(l.subList(1, l.size())); + return script.bindTo(scope.fork()).call(innerArgs); + }); + } + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/libs/IOWrapper.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/libs/IOWrapper.java new file mode 100644 index 0000000..e14fcf3 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/libs/IOWrapper.java @@ -0,0 +1,56 @@ +package io.gitlab.jfronny.muscript.libs; + +import io.gitlab.jfronny.muscript.compiler.MuScriptVersion; +import io.gitlab.jfronny.muscript.compiler.Parser; +import io.gitlab.jfronny.muscript.compiler.SourceFS; +import io.gitlab.jfronny.muscript.data.Script; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public interface IOWrapper { + String readString(String path); + + Script parseScript(String path); + + class Caching implements IOWrapper { + private final Map cachedStrings = new HashMap<>(); + private final Map cachedScripts = new HashMap<>(); + private final IOWrapper inner; + + public Caching(IOWrapper inner) { + this.inner = Objects.requireNonNull(inner); + } + + @Override + public String readString(String path) { + return cachedStrings.computeIfAbsent(path, inner::readString); + } + + @Override + public Script parseScript(String path) { + return cachedScripts.computeIfAbsent(path, inner::parseScript); + } + } + + class SourceFSWrapper implements IOWrapper { + private final SourceFS inner; + private final MuScriptVersion version; + + public SourceFSWrapper(MuScriptVersion version, SourceFS inner) { + this.inner = Objects.requireNonNull(inner); + this.version = Objects.requireNonNull(version); + } + + @Override + public String readString(String path) { + return inner.read(path); + } + + @Override + public Script parseScript(String path) { + return Parser.parseMultiScript(version, path, inner); + } + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/StandardLib.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/libs/StandardLib.java similarity index 99% rename from muscript/src/main/java/io/gitlab/jfronny/muscript/StandardLib.java rename to muscript/src/main/java/io/gitlab/jfronny/muscript/libs/StandardLib.java index dea387c..8b3156d 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/StandardLib.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/libs/StandardLib.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.muscript; +package io.gitlab.jfronny.muscript.libs; import io.gitlab.jfronny.muscript.ast.Expr; import io.gitlab.jfronny.muscript.ast.dynamic.Call; diff --git a/muscript/src/main/java/module-info.java b/muscript/src/main/java/module-info.java index 393ca9e..2d71c06 100644 --- a/muscript/src/main/java/module-info.java +++ b/muscript/src/main/java/module-info.java @@ -6,6 +6,7 @@ module io.gitlab.jfronny.commons.muscript { exports io.gitlab.jfronny.muscript.ast; // General purpose expressions (needed to properly interact with parsed) exports io.gitlab.jfronny.muscript.debug; exports io.gitlab.jfronny.muscript.error; + exports io.gitlab.jfronny.muscript.libs; exports io.gitlab.jfronny.muscript.data; exports io.gitlab.jfronny.muscript.data.dynamic; exports io.gitlab.jfronny.muscript.data.dynamic.additional; diff --git a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/MultiScriptTest.java b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/MultiScriptTest.java index 66044db..aec456e 100644 --- a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/MultiScriptTest.java +++ b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/MultiScriptTest.java @@ -1,6 +1,6 @@ package io.gitlab.jfronny.muscript.test; -import io.gitlab.jfronny.muscript.StandardLib; +import io.gitlab.jfronny.muscript.libs.StandardLib; import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.muscript.compiler.SourceFS; import io.gitlab.jfronny.muscript.data.Scope; diff --git a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/StackTraceTest.java b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/StackTraceTest.java index 1364d39..fef88e6 100644 --- a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/StackTraceTest.java +++ b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/StackTraceTest.java @@ -1,6 +1,6 @@ package io.gitlab.jfronny.muscript.test; -import io.gitlab.jfronny.muscript.StandardLib; +import io.gitlab.jfronny.muscript.libs.StandardLib; import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.muscript.error.LocationalException; diff --git a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/ValidExampleTest.java b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/ValidExampleTest.java index 9784a52..46a06b0 100644 --- a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/ValidExampleTest.java +++ b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/ValidExampleTest.java @@ -1,7 +1,7 @@ package io.gitlab.jfronny.muscript.test; import io.gitlab.jfronny.commons.StringFormatter; -import io.gitlab.jfronny.muscript.StandardLib; +import io.gitlab.jfronny.muscript.libs.StandardLib; import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.muscript.error.LocationalException; import org.junit.jupiter.api.Test; diff --git a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/util/MuTestUtil.java b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/util/MuTestUtil.java index 10aff17..f221e8c 100644 --- a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/util/MuTestUtil.java +++ b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/util/MuTestUtil.java @@ -1,6 +1,6 @@ package io.gitlab.jfronny.muscript.test.util; -import io.gitlab.jfronny.muscript.StandardLib; +import io.gitlab.jfronny.muscript.libs.StandardLib; import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.muscript.ast.Expr;