From f189d982951f7f0e2c3560a20c0d1d8a2b6431d0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 14 Jul 2026 19:49:24 +0100 Subject: Derive Debug and PartialEq for generated Rust types --- examples/01-struct/output/rust/src/point.rs | 2 ++ examples/02-sum/output/rust/src/shapes.rs | 3 +++ .../output/rust/src/arithmetic.rs | 3 +++ examples/04-enum/output/rust/src/numbers.rs | 1 + examples/05-list/output/rust/src/point.rs | 2 ++ .../06-native-type/output/rust/src/gen/point.rs | 1 + examples/06-native-type/output/rust/src/point.rs | 1 + .../output/rust/src/main.rs | 1 + .../output/rust/src/point.rs | 1 + .../08-custom-code/output/rust/src/gen/shapes.rs | 1 + examples/09-imports/output/rust/src/line.rs | 1 + examples/09-imports/output/rust/src/point.rs | 1 + examples/10-transient-0/output/rust/src/data.rs | 12 ++++++++++++ .../generators/rusttypes/RustTypesGenerator.java | 22 +++++++++++++++++++--- 14 files changed, 49 insertions(+), 3 deletions(-) diff --git a/examples/01-struct/output/rust/src/point.rs b/examples/01-struct/output/rust/src/point.rs index f2d7ffc..30b661f 100644 --- a/examples/01-struct/output/rust/src/point.rs +++ b/examples/01-struct/output/rust/src/point.rs @@ -1,12 +1,14 @@ // Generated by hobgoblin. /// A straight line from one point to another. +#[derive(Debug, PartialEq)] pub struct Line { pub start: crate::point::Point, pub end: crate::point::Point, } /// A 2D point. +#[derive(Debug, PartialEq)] pub struct Point { pub x: ::core::primitive::i32, pub y: ::core::primitive::i32, diff --git a/examples/02-sum/output/rust/src/shapes.rs b/examples/02-sum/output/rust/src/shapes.rs index d5b7334..f06dd2b 100644 --- a/examples/02-sum/output/rust/src/shapes.rs +++ b/examples/02-sum/output/rust/src/shapes.rs @@ -1,6 +1,7 @@ // Generated by hobgoblin. /// A 2D shape. +#[derive(Debug, PartialEq)] pub enum Shape { Rectangle(crate::shapes::Rectangle), Triangle(crate::shapes::Triangle), @@ -18,11 +19,13 @@ impl ::std::convert::From for crate::shapes::Shape { } } +#[derive(Debug, PartialEq)] pub struct Rectangle { pub width: ::core::primitive::i32, pub height: ::core::primitive::i32, } +#[derive(Debug, PartialEq)] pub struct Triangle { pub width: ::core::primitive::i32, pub height: ::core::primitive::i32, diff --git a/examples/03-inductive-data-types/output/rust/src/arithmetic.rs b/examples/03-inductive-data-types/output/rust/src/arithmetic.rs index ac7c740..c9ea28d 100644 --- a/examples/03-inductive-data-types/output/rust/src/arithmetic.rs +++ b/examples/03-inductive-data-types/output/rust/src/arithmetic.rs @@ -1,5 +1,6 @@ // Generated by hobgoblin. +#[derive(Debug, PartialEq)] pub enum Expression { Add(::std::boxed::Box), Const(crate::arithmetic::Const), @@ -17,11 +18,13 @@ impl ::std::convert::From for crate::arithmetic::Expre } } +#[derive(Debug, PartialEq)] pub struct Add { pub left: crate::arithmetic::Expression, pub right: crate::arithmetic::Expression, } +#[derive(Debug, PartialEq)] pub struct Const { pub value: ::core::primitive::i32, } diff --git a/examples/04-enum/output/rust/src/numbers.rs b/examples/04-enum/output/rust/src/numbers.rs index e86b453..a4dfa4a 100644 --- a/examples/04-enum/output/rust/src/numbers.rs +++ b/examples/04-enum/output/rust/src/numbers.rs @@ -1,6 +1,7 @@ // Generated by hobgoblin. /// A small number. +#[derive(Debug, PartialEq)] pub enum SmallNumber { Zero, One, diff --git a/examples/05-list/output/rust/src/point.rs b/examples/05-list/output/rust/src/point.rs index 5635d38..e7308db 100644 --- a/examples/05-list/output/rust/src/point.rs +++ b/examples/05-list/output/rust/src/point.rs @@ -1,9 +1,11 @@ // Generated by hobgoblin. +#[derive(Debug, PartialEq)] pub struct Path { pub points: ::std::vec::Vec, } +#[derive(Debug, PartialEq)] pub struct Point { pub x: ::core::primitive::i32, pub y: ::core::primitive::i32, diff --git a/examples/06-native-type/output/rust/src/gen/point.rs b/examples/06-native-type/output/rust/src/gen/point.rs index 01c9d43..e29c94b 100644 --- a/examples/06-native-type/output/rust/src/gen/point.rs +++ b/examples/06-native-type/output/rust/src/gen/point.rs @@ -1,6 +1,7 @@ // Generated by hobgoblin. /// A straight line from one point to another. +#[derive(Debug, PartialEq)] pub struct Line { pub start: crate::point::Point, pub end: crate::point::Point, diff --git a/examples/06-native-type/output/rust/src/point.rs b/examples/06-native-type/output/rust/src/point.rs index bc04e56..8d7c0bf 100644 --- a/examples/06-native-type/output/rust/src/point.rs +++ b/examples/06-native-type/output/rust/src/point.rs @@ -1,3 +1,4 @@ include!("gen/point.rs"); +#[derive(Debug, PartialEq)] pub struct Point(pub i32, pub i32); diff --git a/examples/07-native-type-custom-config/output/rust/src/main.rs b/examples/07-native-type-custom-config/output/rust/src/main.rs index 164fa14..0300d5a 100644 --- a/examples/07-native-type-custom-config/output/rust/src/main.rs +++ b/examples/07-native-type-custom-config/output/rust/src/main.rs @@ -1,5 +1,6 @@ mod point; +#[derive(Debug, PartialEq)] struct Point(i32, i32); #[cfg(test)] diff --git a/examples/07-native-type-custom-config/output/rust/src/point.rs b/examples/07-native-type-custom-config/output/rust/src/point.rs index b073f86..74ac8cd 100644 --- a/examples/07-native-type-custom-config/output/rust/src/point.rs +++ b/examples/07-native-type-custom-config/output/rust/src/point.rs @@ -1,6 +1,7 @@ // Generated by hobgoblin. /// A straight line from one point to another. +#[derive(Debug, PartialEq)] pub struct Line { pub start: crate::Point, pub end: crate::Point, diff --git a/examples/08-custom-code/output/rust/src/gen/shapes.rs b/examples/08-custom-code/output/rust/src/gen/shapes.rs index d0710bb..c5f8af5 100644 --- a/examples/08-custom-code/output/rust/src/gen/shapes.rs +++ b/examples/08-custom-code/output/rust/src/gen/shapes.rs @@ -1,5 +1,6 @@ // Generated by hobgoblin. +#[derive(Debug, PartialEq)] pub struct Square { pub width: ::core::primitive::i32, } diff --git a/examples/09-imports/output/rust/src/line.rs b/examples/09-imports/output/rust/src/line.rs index 01c9d43..e29c94b 100644 --- a/examples/09-imports/output/rust/src/line.rs +++ b/examples/09-imports/output/rust/src/line.rs @@ -1,6 +1,7 @@ // Generated by hobgoblin. /// A straight line from one point to another. +#[derive(Debug, PartialEq)] pub struct Line { pub start: crate::point::Point, pub end: crate::point::Point, diff --git a/examples/09-imports/output/rust/src/point.rs b/examples/09-imports/output/rust/src/point.rs index e2c4695..a0ca4c7 100644 --- a/examples/09-imports/output/rust/src/point.rs +++ b/examples/09-imports/output/rust/src/point.rs @@ -1,6 +1,7 @@ // Generated by hobgoblin. /// A 2D point. +#[derive(Debug, PartialEq)] pub struct Point { pub x: ::core::primitive::i32, pub y: ::core::primitive::i32, diff --git a/examples/10-transient-0/output/rust/src/data.rs b/examples/10-transient-0/output/rust/src/data.rs index 81b0335..d4ddf02 100644 --- a/examples/10-transient-0/output/rust/src/data.rs +++ b/examples/10-transient-0/output/rust/src/data.rs @@ -1,51 +1,61 @@ // Generated by hobgoblin. +#[derive(Debug, PartialEq)] pub struct StructWithBool { pub a: ::core::primitive::bool, pub b: ::core::primitive::bool, } +#[derive(Debug, PartialEq)] pub struct StructWithInt32 { pub a: ::core::primitive::i32, pub b: ::core::primitive::i32, } +#[derive(Debug, PartialEq)] pub struct StructWithInt64 { pub a: ::core::primitive::i64, pub b: ::core::primitive::i64, } +#[derive(Debug, PartialEq)] pub struct StructWithString { pub a: ::std::string::String, pub b: ::std::string::String, } +#[derive(Debug, PartialEq)] pub struct OuterStruct { pub inner: crate::data::InnerStruct, pub c: ::core::primitive::i32, } +#[derive(Debug, PartialEq)] pub struct InnerStruct { pub a: ::core::primitive::i32, pub b: ::core::primitive::i32, } +#[derive(Debug, PartialEq)] pub struct StructWithList { pub a: ::std::vec::Vec<::core::primitive::i64>, pub b: ::std::vec::Vec, } +#[derive(Debug, PartialEq)] pub struct StructWithOption { pub a: ::std::option::Option<::core::primitive::i64>, pub b: ::std::option::Option, } +#[derive(Debug, PartialEq)] pub enum EnumWithVariants { Zero, One, Two, } +#[derive(Debug, PartialEq)] pub enum SumWithVariants { VariantOne(crate::data::VariantOne), VariantTwo(crate::data::VariantTwo), @@ -63,10 +73,12 @@ impl ::std::convert::From for crate::data::SumWithVaria } } +#[derive(Debug, PartialEq)] pub struct VariantOne { pub a: ::core::primitive::i32, } +#[derive(Debug, PartialEq)] pub struct VariantTwo { pub a: ::core::primitive::i64, } 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 19f3365..7695bf4 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 @@ -92,6 +92,8 @@ public class RustTypesGenerator implements Generator { TypedEnumDefinitionNode enumDefinition, Context context ) { + var rustAttributes = List.of(DERIVE_ATTRIBUTE); + var rustEnumName = this.rustGenerator.generateTypeName(enumDefinition.name()); var rustVariants = enumDefinition.variants().stream() @@ -102,7 +104,7 @@ public class RustTypesGenerator implements Generator { .toList(); var rustEnum = new RustEnum( - List.of(), + rustAttributes, rustEnumName, rustVariants, enumDefinition.docComment() @@ -111,10 +113,17 @@ public class RustTypesGenerator implements Generator { return List.of(rustEnum); } + private static final RustOuterAttribute DERIVE_ATTRIBUTE = new RustOuterAttribute( + RustTypePath.of("derive"), + Optional.of("(Debug, PartialEq)") + ); + private List generateStructDefinition( TypedStructDefinitionNode structDefinition, Context context ) { + var rustAttributes = List.of(DERIVE_ATTRIBUTE); + var rustStructName = this.rustGenerator.generateTypeName(structDefinition.name()); var rustFields = structDefinition.fields().stream() @@ -124,7 +133,12 @@ public class RustTypesGenerator implements Generator { )) .toList(); - var rustStruct = new RustStructStruct(List.of(), rustStructName, rustFields, structDefinition.docComment()); + var rustStruct = new RustStructStruct( + rustAttributes, + rustStructName, + rustFields, + structDefinition.docComment() + ); return List.of(rustStruct); } @@ -133,6 +147,8 @@ public class RustTypesGenerator implements Generator { TypedSumDefinitionNode sumDefinition, Context context ) { + var rustAttributes = List.of(DERIVE_ATTRIBUTE); + var items = new ArrayList(); var rustEnumName = this.rustGenerator.generateTypeName(sumDefinition.name()); @@ -156,7 +172,7 @@ public class RustTypesGenerator implements Generator { .toList(); var rustEnum = new RustEnum( - List.of(), + rustAttributes, rustEnumName, rustVariants, sumDefinition.docComment() -- cgit v1.2.3