aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-23 10:58:56 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-23 10:58:56 +0000
commit564596048a284cddc70c88d331a0f2b004dcb587 (patch)
treef97eb8b0f2c7262d6490e76f27d7890aeff11251 /src/main/java
parent85a2a0a7bc643798241ed361c8501ca6288082bf (diff)
Check type of bin element
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/config/ProjectConfig.java12
-rw-r--r--src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java33
2 files changed, 36 insertions, 9 deletions
diff --git a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java
index 4b1c9ff9..7c2533a1 100644
--- a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java
+++ b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java
@@ -57,13 +57,11 @@ public record ProjectConfig(
private static List<BinConfig> binsFromToml(TomlTableWithSource table) {
return table
.getTable("shed")
- .flatMap(shed -> shed.getArray("bins"))
- .map(bins ->
- IntStream.range(0, bins.size())
- .mapToObj(binIndex -> BinConfig.fromToml(bins.getTable(binIndex)))
- .toList()
- )
- .orElseGet(() -> List.of());
+ .flatMap(shed -> shed.getArrayOfTables("bins"))
+ .orElseGet(() -> List.of())
+ .stream()
+ .map(bin -> BinConfig.fromToml(bin.table()))
+ .toList();
}
public static List<ExampleConfig> examplesFromToml(TomlTableWithSource table) {
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 4fac6f88..4f32e761 100644
--- a/src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java
+++ b/src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java
@@ -4,9 +4,12 @@ import org.pcollections.PVector;
import org.shedlang.compiler.config.errors.UnexpectedTypeConfigError;
import org.shedlang.compiler.sources.Source;
import org.tomlj.TomlArray;
+import org.tomlj.TomlPosition;
import org.tomlj.TomlTable;
+import java.util.List;
import java.util.Optional;
+import java.util.stream.IntStream;
public record TomlTableWithSource(
TomlTable table,
@@ -17,6 +20,14 @@ public record TomlTableWithSource(
var value = table.get(key);
var position = table.inputPositionOf(key);
+ return tomlValueToTable(List.of(key), value, position);
+ }
+
+ private Optional<TomlTableWithSource> tomlValueToTable(
+ List<String> subPath,
+ Object value,
+ TomlPosition position
+ ) {
if (value == null || position == null) {
return Optional.empty();
}
@@ -24,13 +35,13 @@ public record TomlTableWithSource(
if (value instanceof TomlTable valueTable) {
return Optional.of(new TomlTableWithSource(
valueTable,
- path.plus(key),
+ path.plusAll(subPath),
fullSource
));
}
throw new UnexpectedTypeConfigError(
- path.plus(key),
+ path.plusAll(subPath),
"a table",
value.getClass(),
TomlSource.sourceAtTomlPosition(fullSource, position)
@@ -56,4 +67,22 @@ public record TomlTableWithSource(
TomlSource.sourceAtTomlPosition(fullSource, position)
);
}
+
+ public Optional<List<TomlTableWithSource>> getArrayOfTables(String key) {
+ return getArray(key).map(array ->
+ IntStream.range(0, array.size())
+ .mapToObj(index -> {
+ var element = array.get(index);
+ var elementPosition = array.inputPositionOf(index);
+ return tomlValueToTable(
+ // TODO: handle indexes in path properly
+ List.of(key, Integer.toString(index)),
+ element,
+ elementPosition
+ );
+ })
+ .flatMap(x -> x.stream())
+ .toList()
+ );
+ }
}