summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-14 19:49:24 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-14 19:49:24 +0100
commitf189d982951f7f0e2c3560a20c0d1d8a2b6431d0 (patch)
tree2c369ef2467f91aaa1a03071998831d0f84e6e7b
parent0e51a1497b98bd190d304acc4c1e1e1f56bf03c7 (diff)
Derive Debug and PartialEq for generated Rust types
-rw-r--r--examples/01-struct/output/rust/src/point.rs2
-rw-r--r--examples/02-sum/output/rust/src/shapes.rs3
-rw-r--r--examples/03-inductive-data-types/output/rust/src/arithmetic.rs3
-rw-r--r--examples/04-enum/output/rust/src/numbers.rs1
-rw-r--r--examples/05-list/output/rust/src/point.rs2
-rw-r--r--examples/06-native-type/output/rust/src/gen/point.rs1
-rw-r--r--examples/06-native-type/output/rust/src/point.rs1
-rw-r--r--examples/07-native-type-custom-config/output/rust/src/main.rs1
-rw-r--r--examples/07-native-type-custom-config/output/rust/src/point.rs1
-rw-r--r--examples/08-custom-code/output/rust/src/gen/shapes.rs1
-rw-r--r--examples/09-imports/output/rust/src/line.rs1
-rw-r--r--examples/09-imports/output/rust/src/point.rs1
-rw-r--r--examples/10-transient-0/output/rust/src/data.rs12
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java22
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<crate::shapes::Triangle> 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<crate::arithmetic::Add>),
Const(crate::arithmetic::Const),
@@ -17,11 +18,13 @@ impl ::std::convert::From<crate::arithmetic::Const> 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<crate::point::Point>,
}
+#[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<crate::data::InnerStruct>,
}
+#[derive(Debug, PartialEq)]
pub struct StructWithOption {
pub a: ::std::option::Option<::core::primitive::i64>,
pub b: ::std::option::Option<crate::data::InnerStruct>,
}
+#[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<crate::data::VariantTwo> 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<RustItem> 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<RustItem>();
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()