From bbd84bea3e34e503ccd49c59fe7d7a3727c6adfa Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 2 Jul 2026 11:35:41 +0100 Subject: Split lang config from generator config --- examples/01-struct/hobgoblin.json5 | 36 ++++++++++++---------- examples/02-sum/hobgoblin.json5 | 26 ++++++++++------ examples/03-list/hobgoblin.json5 | 26 ++++++++++------ examples/04-native-type/hobgoblin.json5 | 26 ++++++++++------ .../05-native-type-custom-config/hobgoblin.json5 | 30 ++++++++++-------- examples/06-custom-code/hobgoblin.json5 | 26 ++++++++++------ examples/07-imports/hobgoblin.json5 | 26 ++++++++++------ examples/08-enum/hobgoblin.json5 | 26 ++++++++++------ hobgoblin/hobgoblin.json5 | 27 +++++++++------- .../hobgoblin/compiler/config/ProjectConfig.java | 14 +++++---- .../generators/java/JavaGeneratorConfig.java | 5 ++- .../JavaPreciselyMatchersGenerator.java | 13 ++++++-- .../generators/javatypes/JavaTypesGenerator.java | 12 ++++++-- .../generators/rusttypes/RustTypesGenerator.java | 2 +- 14 files changed, 182 insertions(+), 113 deletions(-) diff --git a/examples/01-struct/hobgoblin.json5 b/examples/01-struct/hobgoblin.json5 index 4e7dfaa..19e0f93 100644 --- a/examples/01-struct/hobgoblin.json5 +++ b/examples/01-struct/hobgoblin.json5 @@ -1,19 +1,23 @@ { - outputs: [ - { - generator: "java-types", - path: "output/java/src/gen/java", - packageName: "org.zwobble.example.types" + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, }, - // TODO: remove duplication between configs - { - generator: "java-precisely-matchers", - path: "output/java/src/gen/java", - packageName: "org.zwobble.example.types", - }, - { - generator: "rust-types", - path: "output/rust/src", - }, - ], + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "java-precisely-matchers", + path: "output/java/src/gen/java", + }, + { + generator: "rust-types", + path: "output/rust/src", + }, + ], + } } diff --git a/examples/02-sum/hobgoblin.json5 b/examples/02-sum/hobgoblin.json5 index 2bf59c3..12713d4 100644 --- a/examples/02-sum/hobgoblin.json5 +++ b/examples/02-sum/hobgoblin.json5 @@ -1,13 +1,19 @@ { - outputs: [ - { - generator: "java-types", - path: "output/java/src/gen/java", - packageName: "org.zwobble.example.types" + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, }, - { - generator: "rust-types", - path: "output/rust/src", - }, - ], + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "rust-types", + path: "output/rust/src", + }, + ], + }, } diff --git a/examples/03-list/hobgoblin.json5 b/examples/03-list/hobgoblin.json5 index 2bf59c3..12713d4 100644 --- a/examples/03-list/hobgoblin.json5 +++ b/examples/03-list/hobgoblin.json5 @@ -1,13 +1,19 @@ { - outputs: [ - { - generator: "java-types", - path: "output/java/src/gen/java", - packageName: "org.zwobble.example.types" + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, }, - { - generator: "rust-types", - path: "output/rust/src", - }, - ], + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "rust-types", + path: "output/rust/src", + }, + ], + }, } diff --git a/examples/04-native-type/hobgoblin.json5 b/examples/04-native-type/hobgoblin.json5 index 8f92e51..a0f60c3 100644 --- a/examples/04-native-type/hobgoblin.json5 +++ b/examples/04-native-type/hobgoblin.json5 @@ -1,13 +1,19 @@ { - outputs: [ - { - generator: "java-types", - path: "output/java/src/gen/java", - packageName: "org.zwobble.example.types", + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, }, - { - generator: "rust-types", - path: "output/rust/src/gen", - }, - ], + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "rust-types", + path: "output/rust/src/gen", + }, + ], + }, } diff --git a/examples/05-native-type-custom-config/hobgoblin.json5 b/examples/05-native-type-custom-config/hobgoblin.json5 index 89048ac..1c92a49 100644 --- a/examples/05-native-type-custom-config/hobgoblin.json5 +++ b/examples/05-native-type-custom-config/hobgoblin.json5 @@ -1,15 +1,21 @@ { - outputs: [ - { - generator: "java-types", - path: "output/java/src/gen/java", - packageName: "org.zwobble.example.types", - nativeTypes: [ - { - hobgoblin: "point.Point", - java: "org.zwobble.example.Point", - } - ] + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + nativeTypes: [ + { + hobgoblin: "point.Point", + java: "org.zwobble.example.Point", + }, + ], + }, }, - ], + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + ], + }, } diff --git a/examples/06-custom-code/hobgoblin.json5 b/examples/06-custom-code/hobgoblin.json5 index d599806..1d08a40 100644 --- a/examples/06-custom-code/hobgoblin.json5 +++ b/examples/06-custom-code/hobgoblin.json5 @@ -1,13 +1,19 @@ { - outputs: [ - { - generator: "java-types", - path: "output/java/src/main/java", - packageName: "org.zwobble.example.types" + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, }, - { - generator: "rust-types", - path: "output/rust/src/gen", - }, - ], + generators: [ + { + generator: "java-types", + path: "output/java/src/main/java", + }, + { + generator: "rust-types", + path: "output/rust/src/gen", + }, + ], + }, } diff --git a/examples/07-imports/hobgoblin.json5 b/examples/07-imports/hobgoblin.json5 index 2bf59c3..12713d4 100644 --- a/examples/07-imports/hobgoblin.json5 +++ b/examples/07-imports/hobgoblin.json5 @@ -1,13 +1,19 @@ { - outputs: [ - { - generator: "java-types", - path: "output/java/src/gen/java", - packageName: "org.zwobble.example.types" + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, }, - { - generator: "rust-types", - path: "output/rust/src", - }, - ], + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "rust-types", + path: "output/rust/src", + }, + ], + }, } diff --git a/examples/08-enum/hobgoblin.json5 b/examples/08-enum/hobgoblin.json5 index 2bf59c3..12713d4 100644 --- a/examples/08-enum/hobgoblin.json5 +++ b/examples/08-enum/hobgoblin.json5 @@ -1,13 +1,19 @@ { - outputs: [ - { - generator: "java-types", - path: "output/java/src/gen/java", - packageName: "org.zwobble.example.types" + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, }, - { - generator: "rust-types", - path: "output/rust/src", - }, - ], + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "rust-types", + path: "output/rust/src", + }, + ], + }, } diff --git a/hobgoblin/hobgoblin.json5 b/hobgoblin/hobgoblin.json5 index 36c7014..3de67b4 100644 --- a/hobgoblin/hobgoblin.json5 +++ b/hobgoblin/hobgoblin.json5 @@ -1,14 +1,19 @@ { - outputs: [ - { - generator: "java-types", - path: "../src/main/java", - packageName: "org.zwobble.hobgoblin.compiler", + outputs: { + langs: { + java: { + packageName: "org.zwobble.hobgoblin.compiler", + }, }, - { - generator: "java-precisely-matchers", - path: "../src/test/java", - packageName: "org.zwobble.hobgoblin.compiler", - } - ], + generators: [ + { + generator: "java-types", + path: "../src/main/java", + }, + { + generator: "java-precisely-matchers", + path: "../src/test/java", + } + ], + }, } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java index 132a89d..835b496 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java @@ -30,21 +30,23 @@ public record ProjectConfig( } private static ProjectConfig fromJson5(Path projectRoot, Json5ObjectReader document) { - var outputsJson = document.getArrayOfObjects("outputs").orElseThrow(); + var outputsJson = document.getObject("outputs").orElseThrow(); + var generatorsJson = outputsJson.getArrayOfObjects("generators").orElseThrow(); + var langsJson = outputsJson.getObject("langs"); var outputs = new ArrayList(); - for (var outputJson : outputsJson) { - var generatorName = outputJson.getString("generator"); + for (var generatorJson : generatorsJson) { + var generatorName = generatorJson.getString("generator"); var output = switch (generatorName.value()) { case JavaTypesGenerator.NAME -> - JavaTypesGenerator.parseOutputConfig(projectRoot, outputJson); + JavaTypesGenerator.parseGeneratorConfig(projectRoot, generatorJson, langsJson); case JavaPreciselyMatchersGenerator.NAME -> - JavaPreciselyMatchersGenerator.parseOutputConfig(projectRoot, outputJson); + JavaPreciselyMatchersGenerator.parseGeneratorConfig(projectRoot, generatorJson, langsJson); case RustTypesGenerator.NAME -> - RustTypesGenerator.parseOutputConfig(projectRoot, outputJson); + RustTypesGenerator.parseGeneratorConfig(projectRoot, generatorJson); default -> throw new UnknownGeneratorError( diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java index 4b216a3..f22e8ff 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java @@ -14,7 +14,10 @@ public record JavaGeneratorConfig( Map namespaceConfigs, Map nativeTypeConfigs ) { - public static JavaGeneratorConfig parseOutputConfig(Json5ObjectReader output) { + public static JavaGeneratorConfig parseLangsConfig(Optional langsJson) { + // TODO: better error if missing + var output = langsJson.orElseThrow().getObject("java").orElseThrow(); + var packageName = output.getString("packageName").value(); var namespaceConfigs = parseNamespaceConfigs(output); var nativeTypeConfigs = parseNativeTypeConfigs(output); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java index fe2caa6..b693ef3 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java @@ -15,17 +15,24 @@ import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static org.zwobble.hobgoblin.compiler.util.Casing.lowerCamelCaseToUpperCamelCase; public class JavaPreciselyMatchersGenerator implements Generator { public static final String NAME = "java-precisely-matchers"; - public static OutputConfig parseOutputConfig(Path projectRoot, Json5ObjectReader output) { + public static OutputConfig parseGeneratorConfig( + Path projectRoot, + Json5ObjectReader generatorJson, + Optional langsJson + ) { return () -> { - var relativeOutputPath = output.getString("path").value(); + var relativeOutputPath = generatorJson.getString("path").value(); var outputPath = projectRoot.resolve(relativeOutputPath); - var javaConfig = JavaGeneratorConfig.parseOutputConfig(output); + + var javaConfig = JavaGeneratorConfig.parseLangsConfig(langsJson); + var javaGenerator = new JavaGenerator(javaConfig); return new JavaPreciselyMatchersGenerator(outputPath, javaGenerator); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java index d74322f..b601224 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java @@ -24,11 +24,17 @@ public class JavaTypesGenerator implements Generator { private static final JavaIdentifier BUILDER_TYPE_NAME = JavaIdentifier.of("Builder"); private static final JavaIdentifier BUILD_METHOD_NAME = JavaIdentifier.of("build"); - public static OutputConfig parseOutputConfig(Path projectRoot, Json5ObjectReader output) { + public static OutputConfig parseGeneratorConfig( + Path projectRoot, + Json5ObjectReader generatorJson, + Optional langsJson + ) { return () -> { - var relativeOutputPath = output.getString("path").value(); + var relativeOutputPath = generatorJson.getString("path").value(); var outputPath = projectRoot.resolve(relativeOutputPath); - var javaConfig = JavaGeneratorConfig.parseOutputConfig(output); + + var javaConfig = JavaGeneratorConfig.parseLangsConfig(langsJson); + var javaGenerator = new JavaGenerator(javaConfig); return new JavaTypesGenerator(outputPath, javaConfig, javaGenerator); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java index 3847433..4593d38 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java @@ -21,7 +21,7 @@ import java.util.stream.Collectors; public class RustTypesGenerator implements Generator { public static final String NAME = "rust-types"; - public static OutputConfig parseOutputConfig(Path projectRoot, Json5ObjectReader output) { + public static OutputConfig parseGeneratorConfig(Path projectRoot, Json5ObjectReader output) { return () -> { var relativeOutputPath = output.getString("path").value(); var outputPath = projectRoot.resolve(relativeOutputPath); -- cgit v1.2.3