From 1d0a52cfbb17d77eef8d89be7762203f7286e92f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 23 Dec 2024 11:38:39 +0000 Subject: Check type of string in config --- .../compiler/config/toml/TomlTableWithSource.java | 14 ++++++++-- .../shedlang/compiler/config/BinConfigTests.java | 32 ++++++++++++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) (limited to 'src') 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 e11925f6..3e560d63 100644 --- a/src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java +++ b/src/main/java/org/shedlang/compiler/config/toml/TomlTableWithSource.java @@ -107,7 +107,8 @@ public record TomlTableWithSource( } public String getString(String key) { - var value = table.getString(key); + var value = table.get(key); + var valuePosition = table.inputPositionOf(key); if (value == null) { throw new ConfigError( @@ -116,6 +117,15 @@ public record TomlTableWithSource( ); } - return value; + if (value instanceof String valueString) { + return valueString; + } + + throw new UnexpectedTypeConfigError( + path.plusKey(key), + "a string", + value.getClass(), + TomlSource.sourceAtTomlPosition(fullSource, valuePosition) + ); } } diff --git a/src/test/java/org/shedlang/compiler/config/BinConfigTests.java b/src/test/java/org/shedlang/compiler/config/BinConfigTests.java index cbe8ee01..dc61f023 100644 --- a/src/test/java/org/shedlang/compiler/config/BinConfigTests.java +++ b/src/test/java/org/shedlang/compiler/config/BinConfigTests.java @@ -38,6 +38,31 @@ public class BinConfigTests { )); } + @Test + public void whenBinConfigIsNotStringThenErrorIsThrown() { + var source = Sources.string(""" + [[shed.bins]] + name = "one" + main-namespace = "One" + + [[shed.bins]] + name = true + main-namespace = "Two" + """); + + var error = assertThrows( + ConfigError.class, + () -> ProjectConfig.fromToml(PROJECT_PATH, TomlTableWithSource.parse(source)) + ); + + assertThat(error.getMessage(), equalTo("Expected shed.bins[1].name to be a string, but was Boolean")); + assertThat(error.source().describe(), equalTo(""" + :6:1 + name = true + ^""" + )); + } + @Test public void whenBinConfigIsMissingMainNamespaceThenErrorIsThrown() { var source = Sources.string(""" @@ -47,6 +72,7 @@ public class BinConfigTests { [[shed.bins]] name = "two" + main-namespace = true """); var error = assertThrows( @@ -54,10 +80,10 @@ public class BinConfigTests { () -> ProjectConfig.fromToml(PROJECT_PATH, TomlTableWithSource.parse(source)) ); - assertThat(error.getMessage(), equalTo("shed.bins[1] is missing main-namespace")); + assertThat(error.getMessage(), equalTo("Expected shed.bins[1].main-namespace to be a string, but was Boolean")); assertThat(error.source().describe(), equalTo(""" - :5:1 - [[shed.bins]] + :7:1 + main-namespace = true ^""" )); } -- cgit v1.2.3