diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-07-02 09:51:11 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-07-02 09:57:26 +0100 |
| commit | 3d6034f51eba69de538ce2b7ccdd59654870db1d (patch) | |
| tree | fb729409d57958a01b0755defbb77eb1293e88d7 /src/main/java | |
| parent | 514a0eefe86174ba535f46f3fb3481c539b79f96 (diff) | |
Add rust enums
Diffstat (limited to 'src/main/java')
7 files changed, 199 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java index 514e3f5..51de98a 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java @@ -56,12 +56,52 @@ public class RustWriter implements AutoCloseable { void writeItem(RustItem item) throws IOException { switch (item) { + case RustEnum enum_ -> { + writeEnum(enum_); + } + case RustStructStruct structStruct -> { writeStructStruct(structStruct); } } } + private void writeEnum(RustEnum enum_) throws IOException { + this.writeDocComment(enum_.docComment()); + this.writer.write("pub enum "); + this.writeIdentifier(enum_.name()); + this.writer.write(" {"); + + if (!enum_.variants().isEmpty()) { + this.writer.indent(); + + for (var variant : enum_.variants()) { + this.writer.newLine(); + writeIdentifier(variant.name()); + this.writer.write("("); + + switch (variant.fields()) { + case RustEnumVariantTuple tuple -> { + writeWithSeparator( + tuple.fields(), + field -> { + this.writeType(field.type()); + }, + () -> this.writer.write(", ") + ); + } + } + + this.writer.write("),"); + } + + this.writer.dedent(); + } + + this.writer.newLine(); + this.writer.write("}"); + } + private void writeStructStruct(RustStructStruct structStruct) throws IOException { this.writeDocComment(structStruct.docComment()); this.writer.write("pub struct "); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnum.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnum.java new file mode 100644 index 0000000..338bdb4 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnum.java @@ -0,0 +1,40 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum imports + +public record RustEnum(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant> variants, org.zwobble.hobgoblin.compiler.ast.DocComment docComment) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem { + public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder arbitrary() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), java.util.List.of(), org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment()); + } + + public record Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant> variants, org.zwobble.hobgoblin.compiler.ast.DocComment docComment) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem.Builder { + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum build() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum(name, variants, docComment); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(name, variants, docComment); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.Builder name) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(name.build(), variants, docComment); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder withVariants(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant> variants) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(name, variants, docComment); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder withDocComment(org.zwobble.hobgoblin.compiler.ast.DocComment docComment) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(name, variants, docComment); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum body +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariant.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariant.java new file mode 100644 index 0000000..3eff7a1 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariant.java @@ -0,0 +1,40 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant imports + +public record RustEnumVariant(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields fields) { + public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder arbitrary() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.arbitrary().build()); + } + + public record Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields fields) { + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant build() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant(name, fields); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(name, fields); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.Builder name) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(name.build(), fields); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder withFields(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields fields) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(name, fields); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder withFields(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields.Builder fields) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(name, fields.build()); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant body +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantFields.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantFields.java new file mode 100644 index 0000000..56d39e6 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantFields.java @@ -0,0 +1,18 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields imports + +public sealed interface RustEnumVariantFields permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple { + public interface Builder { + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields build(); + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields body +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTuple.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTuple.java new file mode 100644 index 0000000..a8b1e68 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTuple.java @@ -0,0 +1,28 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple imports + +public record RustEnumVariantTuple(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField> fields) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields { + public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder arbitrary() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder(java.util.List.of()); + } + + public record Builder(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField> fields) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields.Builder { + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple build() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple(fields); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder withFields(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField> fields) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder(fields); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple body +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustItem.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustItem.java index d1fa342..4471b49 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustItem.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustItem.java @@ -5,7 +5,7 @@ package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem imports // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem imports -public sealed interface RustItem permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustStructStruct { +public sealed interface RustItem permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustStructStruct { public interface Builder { public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem build(); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleField.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleField.java new file mode 100644 index 0000000..4a2eb76 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleField.java @@ -0,0 +1,32 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField imports + +public record RustTupleField(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType type) { + public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder arbitrary() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypePath.arbitrary().build()); + } + + public record Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType type) { + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField build() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField(type); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder withType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType type) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder(type); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder withType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType.Builder type) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder(type.build()); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField body +} |
