From 39ab36c7a288e8ccf1203f8bb828f97e6aa025ea Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 23 Dec 2024 11:10:51 +0000 Subject: Print Toml element indexes properly --- .../shedlang/compiler/config/ProjectConfig.java | 3 +- .../config/errors/UnexpectedTypeConfigError.java | 6 ++-- .../shedlang/compiler/config/toml/TomlPath.java | 35 ++++++++++++++++++++++ .../compiler/config/toml/TomlTableWithSource.java | 16 +++++----- 4 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/config/toml/TomlPath.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java index 7c2533a1..8f5f63e2 100644 --- a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java +++ b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.config; import org.shedlang.compiler.config.errors.TomlSyntaxConfigError; +import org.shedlang.compiler.config.toml.TomlPath; import org.shedlang.compiler.config.toml.TomlTableWithSource; import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.sources.Sources; @@ -42,7 +43,7 @@ public record ProjectConfig( throw TomlSyntaxConfigError.fromTomljError(error, source); } - return fromToml(projectPath, new TomlTableWithSource(result, P.vector(), source)); + return fromToml(projectPath, new TomlTableWithSource(result, TomlPath.TOP, source)); } public static ProjectConfig fromToml(Path root, TomlTableWithSource table) { diff --git a/src/main/java/org/shedlang/compiler/config/errors/UnexpectedTypeConfigError.java b/src/main/java/org/shedlang/compiler/config/errors/UnexpectedTypeConfigError.java index 4c3ba6c5..0b0eda67 100644 --- a/src/main/java/org/shedlang/compiler/config/errors/UnexpectedTypeConfigError.java +++ b/src/main/java/org/shedlang/compiler/config/errors/UnexpectedTypeConfigError.java @@ -1,13 +1,13 @@ package org.shedlang.compiler.config.errors; +import org.shedlang.compiler.config.toml.TomlPath; import org.shedlang.compiler.sources.Source; import java.text.MessageFormat; -import java.util.List; public class UnexpectedTypeConfigError extends ConfigError { public UnexpectedTypeConfigError( - List path, + TomlPath path, String expectedType, Class actualType, Source source @@ -15,7 +15,7 @@ public class UnexpectedTypeConfigError extends ConfigError { super( MessageFormat.format( "Expected {0} to be {1}, but was {2}", - String.join(".", path), + path, expectedType, actualType.getSimpleName() ), diff --git a/src/main/java/org/shedlang/compiler/config/toml/TomlPath.java b/src/main/java/org/shedlang/compiler/config/toml/TomlPath.java new file mode 100644 index 00000000..dc5910a9 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/config/toml/TomlPath.java @@ -0,0 +1,35 @@ +package org.shedlang.compiler.config.toml; + +import org.pcollections.PVector; +import org.shedlang.compiler.util.CheckReturnValue; +import org.shedlang.compiler.util.P; + +import java.text.MessageFormat; + +public class TomlPath { + public static final TomlPath TOP = new TomlPath(P.vector()); + + private final PVector components; + + private TomlPath(PVector components) { + this.components = components; + } + + @CheckReturnValue + public TomlPath plusKey(String key) { + // TODO: handle string escaping + var component = components.isEmpty() ? key : "." + key; + return new TomlPath(this.components.plus(component)); + } + + @CheckReturnValue + public TomlPath plusIndex(int index) { + var component = MessageFormat.format("[{0}]", index); + return new TomlPath(this.components.plus(component)); + } + + @Override + public String toString() { + return String.join("", this.components); + } +} diff --git a/src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java b/src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java index 4f32e761..5b573628 100644 --- a/src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java +++ b/src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java @@ -1,6 +1,5 @@ package org.shedlang.compiler.config.toml; -import org.pcollections.PVector; import org.shedlang.compiler.config.errors.UnexpectedTypeConfigError; import org.shedlang.compiler.sources.Source; import org.tomlj.TomlArray; @@ -13,18 +12,18 @@ import java.util.stream.IntStream; public record TomlTableWithSource( TomlTable table, - PVector path, + TomlPath path, Source fullSource ) { public Optional getTable(String key) { var value = table.get(key); var position = table.inputPositionOf(key); - return tomlValueToTable(List.of(key), value, position); + return tomlValueToTable(path.plusKey(key), value, position); } private Optional tomlValueToTable( - List subPath, + TomlPath valuePath, Object value, TomlPosition position ) { @@ -35,13 +34,13 @@ public record TomlTableWithSource( if (value instanceof TomlTable valueTable) { return Optional.of(new TomlTableWithSource( valueTable, - path.plusAll(subPath), + valuePath, fullSource )); } throw new UnexpectedTypeConfigError( - path.plusAll(subPath), + valuePath, "a table", value.getClass(), TomlSource.sourceAtTomlPosition(fullSource, position) @@ -61,7 +60,7 @@ public record TomlTableWithSource( } throw new UnexpectedTypeConfigError( - path.plus(key), + path.plusKey(key), "an array", value.getClass(), TomlSource.sourceAtTomlPosition(fullSource, position) @@ -75,8 +74,7 @@ public record TomlTableWithSource( var element = array.get(index); var elementPosition = array.inputPositionOf(index); return tomlValueToTable( - // TODO: handle indexes in path properly - List.of(key, Integer.toString(index)), + path.plusKey(key).plusIndex(index), element, elementPosition ); -- cgit v1.2.3