summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-02 10:07:12 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-02 10:07:12 +0100
commit0568d7e77dbe004864e19a75a2216e233fbfad2b (patch)
tree3e2693318e7018e12adf7ab56c5877be6214477c
parent5447ee9766b101d20fdb1745b6f57411d6896264 (diff)
Support translating enums into Rust types
-rw-r--r--examples/07-enum/hobgoblin.json54
-rw-r--r--examples/07-enum/output/rust/.gitignore1
-rw-r--r--examples/07-enum/output/rust/Cargo.lock7
-rw-r--r--examples/07-enum/output/rust/Cargo.toml6
-rw-r--r--examples/07-enum/output/rust/rust-toolchain.toml2
-rw-r--r--examples/07-enum/output/rust/src/main.rs7
-rw-r--r--examples/07-enum/output/rust/src/numbers.rs6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java29
8 files changed, 60 insertions, 2 deletions
diff --git a/examples/07-enum/hobgoblin.json5 b/examples/07-enum/hobgoblin.json5
index 1ec9568..2bf59c3 100644
--- a/examples/07-enum/hobgoblin.json5
+++ b/examples/07-enum/hobgoblin.json5
@@ -5,5 +5,9 @@
path: "output/java/src/gen/java",
packageName: "org.zwobble.example.types"
},
+ {
+ generator: "rust-types",
+ path: "output/rust/src",
+ },
],
}
diff --git a/examples/07-enum/output/rust/.gitignore b/examples/07-enum/output/rust/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/examples/07-enum/output/rust/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/examples/07-enum/output/rust/Cargo.lock b/examples/07-enum/output/rust/Cargo.lock
new file mode 100644
index 0000000..9dc6e3e
--- /dev/null
+++ b/examples/07-enum/output/rust/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "example"
+version = "0.1.0"
diff --git a/examples/07-enum/output/rust/Cargo.toml b/examples/07-enum/output/rust/Cargo.toml
new file mode 100644
index 0000000..5d4c622
--- /dev/null
+++ b/examples/07-enum/output/rust/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "example"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
diff --git a/examples/07-enum/output/rust/rust-toolchain.toml b/examples/07-enum/output/rust/rust-toolchain.toml
new file mode 100644
index 0000000..4fedb95
--- /dev/null
+++ b/examples/07-enum/output/rust/rust-toolchain.toml
@@ -0,0 +1,2 @@
+[toolchain]
+channel = "1.96"
diff --git a/examples/07-enum/output/rust/src/main.rs b/examples/07-enum/output/rust/src/main.rs
new file mode 100644
index 0000000..2201dcc
--- /dev/null
+++ b/examples/07-enum/output/rust/src/main.rs
@@ -0,0 +1,7 @@
+mod numbers;
+
+use numbers::SmallNumber;
+
+fn main() {
+ let small_number = SmallNumber::One;
+}
diff --git a/examples/07-enum/output/rust/src/numbers.rs b/examples/07-enum/output/rust/src/numbers.rs
new file mode 100644
index 0000000..b71f573
--- /dev/null
+++ b/examples/07-enum/output/rust/src/numbers.rs
@@ -0,0 +1,6 @@
+/// A small number.
+pub enum SmallNumber {
+ Zero,
+ One,
+ Two,
+}
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 e681a3e..b71c9ed 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
@@ -80,7 +80,7 @@ public class RustTypesGenerator implements Generator {
) {
return switch (statement) {
case TypedEnumDefinitionNode enumDefinition -> {
- yield List.of();
+ yield generateEnumDefinition(enumDefinition, context);
}
case TypedNativeTypeDefinitionNode nativeTypeDefinition -> {
@@ -97,6 +97,28 @@ public class RustTypesGenerator implements Generator {
};
}
+ private List<RustItem> generateEnumDefinition(
+ TypedEnumDefinitionNode enumDefinition,
+ Context context
+ ) {
+ var rustEnumName = generateTypeName(enumDefinition.name());
+
+ var rustVariants = enumDefinition.variants().stream()
+ .map(variant -> new RustEnumVariant(
+ generateVariantName(variant.name()),
+ new RustEnumVariantNoFields()
+ ))
+ .toList();
+
+ var rustEnum = new RustEnum(
+ rustEnumName,
+ rustVariants,
+ enumDefinition.docComment()
+ );
+
+ return List.of(rustEnum);
+ }
+
private List<RustItem> generateStructDefinition(
TypedStructDefinitionNode structDefinition,
Context context
@@ -216,13 +238,16 @@ public class RustTypesGenerator implements Generator {
return new RustIdentifier(Casing.lowerCamelCaseToSnakeCase(part));
}
+ private RustIdentifier generateVariantName(String enumVariantName) {
+ return generateTypeName(Casing.lowerCamelCaseToUpperCamelCase(enumVariantName));
+ }
+
private RustIdentifier generateVariantName(Type type) {
if (type instanceof StructType structType) {
return generateTypeName(structType.name());
} else {
throw new UnsupportedOperationException("TODO");
}
-
}
private static class Context {