From 564596048a284cddc70c88d331a0f2b004dcb587 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 23 Dec 2024 10:58:56 +0000 Subject: Check type of bin element --- .../shedlang/compiler/config/ProjectConfig.java | 12 ++++---- .../compiler/config/toml/TomlTableWithSource.java | 33 ++++++++++++++++++++-- 2 files changed, 36 insertions(+), 9 deletions(-) (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 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 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 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 tomlValueToTable( + List 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> 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() + ); + } } -- cgit v1.2.3