diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-12-23 10:58:56 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-12-23 10:58:56 +0000 |
| commit | 564596048a284cddc70c88d331a0f2b004dcb587 (patch) | |
| tree | f97eb8b0f2c7262d6490e76f27d7890aeff11251 /src/main/java | |
| parent | 85a2a0a7bc643798241ed361c8501ca6288082bf (diff) | |
Check type of bin element
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/config/ProjectConfig.java | 12 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java | 33 |
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() + ); + } } |
