From 0568d7e77dbe004864e19a75a2216e233fbfad2b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 2 Jul 2026 10:07:12 +0100 Subject: Support translating enums into Rust types --- .../generators/rusttypes/RustTypesGenerator.java | 29 ++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'src/main') 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 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 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 { -- cgit v1.2.3