aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-23 11:10:51 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-23 11:10:51 +0000
commit39ab36c7a288e8ccf1203f8bb828f97e6aa025ea (patch)
tree481a9132bb1e166315b016856976b66db46843e6 /src/main/java
parent564596048a284cddc70c88d331a0f2b004dcb587 (diff)
Print Toml element indexes properly
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/config/ProjectConfig.java3
-rw-r--r--src/main/java/org/shedlang/compiler/config/errors/UnexpectedTypeConfigError.java6
-rw-r--r--src/main/java/org/shedlang/compiler/config/toml/TomlPath.java35
-rw-r--r--src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java16
4 files changed, 47 insertions, 13 deletions
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<String> 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<String> components;
+
+ private TomlPath(PVector<String> 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<String> path,
+ TomlPath path,
Source fullSource
) {
public Optional<TomlTableWithSource> 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<TomlTableWithSource> tomlValueToTable(
- List<String> 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
);