From 5113f2157c5aa257ad7ebf555cb6a551701d169a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 10 Aug 2026 10:19:49 +0100 Subject: Add generic struct example without any outputs --- examples/06-inductive-data-types/hobgoblin.json5 | 19 +++++++++++++ .../06-inductive-data-types/output/java/.gitignore | 2 ++ .../06-inductive-data-types/output/java/pom.xml | 1 + .../main/java/org/zwobble/example/Arithmetic.java | 17 +++++++++++ .../java/org/zwobble/example/ArithmeticTests.java | 24 ++++++++++++++++ .../06-inductive-data-types/output/rust/.gitignore | 1 + .../06-inductive-data-types/output/rust/Cargo.lock | 7 +++++ .../06-inductive-data-types/output/rust/Cargo.toml | 6 ++++ .../output/rust/rust-toolchain.toml | 2 ++ .../output/rust/src/arithmetic.rs | 30 ++++++++++++++++++++ .../06-inductive-data-types/output/rust/src/lib.rs | 33 ++++++++++++++++++++++ .../06-inductive-data-types/src/arithmetic.hob | 13 +++++++++ 12 files changed, 155 insertions(+) create mode 100644 examples/06-inductive-data-types/hobgoblin.json5 create mode 100644 examples/06-inductive-data-types/output/java/.gitignore create mode 120000 examples/06-inductive-data-types/output/java/pom.xml create mode 100644 examples/06-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java create mode 100644 examples/06-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java create mode 100644 examples/06-inductive-data-types/output/rust/.gitignore create mode 100644 examples/06-inductive-data-types/output/rust/Cargo.lock create mode 100644 examples/06-inductive-data-types/output/rust/Cargo.toml create mode 100644 examples/06-inductive-data-types/output/rust/rust-toolchain.toml create mode 100644 examples/06-inductive-data-types/output/rust/src/arithmetic.rs create mode 100644 examples/06-inductive-data-types/output/rust/src/lib.rs create mode 100644 examples/06-inductive-data-types/src/arithmetic.hob (limited to 'examples/06-inductive-data-types') diff --git a/examples/06-inductive-data-types/hobgoblin.json5 b/examples/06-inductive-data-types/hobgoblin.json5 new file mode 100644 index 0000000..12713d4 --- /dev/null +++ b/examples/06-inductive-data-types/hobgoblin.json5 @@ -0,0 +1,19 @@ +{ + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, + }, + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "rust-types", + path: "output/rust/src", + }, + ], + }, +} diff --git a/examples/06-inductive-data-types/output/java/.gitignore b/examples/06-inductive-data-types/output/java/.gitignore new file mode 100644 index 0000000..ff511d4 --- /dev/null +++ b/examples/06-inductive-data-types/output/java/.gitignore @@ -0,0 +1,2 @@ +/src/gen/ +/target/ diff --git a/examples/06-inductive-data-types/output/java/pom.xml b/examples/06-inductive-data-types/output/java/pom.xml new file mode 120000 index 0000000..445fa65 --- /dev/null +++ b/examples/06-inductive-data-types/output/java/pom.xml @@ -0,0 +1 @@ +../../../templates/java-junit/pom.xml \ No newline at end of file diff --git a/examples/06-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java b/examples/06-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java new file mode 100644 index 0000000..08cb75c --- /dev/null +++ b/examples/06-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java @@ -0,0 +1,17 @@ +package org.zwobble.example; + +import org.zwobble.example.types.arithmetic.Add; +import org.zwobble.example.types.arithmetic.Const; +import org.zwobble.example.types.arithmetic.Expression; + +public class Arithmetic { + public static int eval(Expression expression) { + return switch (expression) { + case Add(var left, var right) -> + eval(left) + eval(right); + + case Const(var value) -> + value; + }; + } +} diff --git a/examples/06-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java b/examples/06-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java new file mode 100644 index 0000000..cd4fdd0 --- /dev/null +++ b/examples/06-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java @@ -0,0 +1,24 @@ +package org.zwobble.example; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.zwobble.example.types.arithmetic.Add; +import org.zwobble.example.types.arithmetic.Const; +import org.zwobble.example.types.arithmetic.Expression; + +public class ArithmeticTests { + @Test + public void eval() { + Expression expression = new Add( + new Add( + new Const(42), + new Const(47) + ), + new Const(52) + ); + + int result = Arithmetic.eval(expression); + + assertEquals(result, 141); + } +} diff --git a/examples/06-inductive-data-types/output/rust/.gitignore b/examples/06-inductive-data-types/output/rust/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/examples/06-inductive-data-types/output/rust/.gitignore @@ -0,0 +1 @@ +/target diff --git a/examples/06-inductive-data-types/output/rust/Cargo.lock b/examples/06-inductive-data-types/output/rust/Cargo.lock new file mode 100644 index 0000000..9dc6e3e --- /dev/null +++ b/examples/06-inductive-data-types/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/06-inductive-data-types/output/rust/Cargo.toml b/examples/06-inductive-data-types/output/rust/Cargo.toml new file mode 100644 index 0000000..5d4c622 --- /dev/null +++ b/examples/06-inductive-data-types/output/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "example" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/examples/06-inductive-data-types/output/rust/rust-toolchain.toml b/examples/06-inductive-data-types/output/rust/rust-toolchain.toml new file mode 100644 index 0000000..4fedb95 --- /dev/null +++ b/examples/06-inductive-data-types/output/rust/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.96" diff --git a/examples/06-inductive-data-types/output/rust/src/arithmetic.rs b/examples/06-inductive-data-types/output/rust/src/arithmetic.rs new file mode 100644 index 0000000..248d2c1 --- /dev/null +++ b/examples/06-inductive-data-types/output/rust/src/arithmetic.rs @@ -0,0 +1,30 @@ +// Generated by hobgoblin. + +#[derive(Clone, Debug, Hash, PartialEq)] +pub enum Expression { + Add(::std::boxed::Box::), + Const(crate::arithmetic::Const), +} + +impl ::std::convert::From:: for crate::arithmetic::Expression { + fn from(value: crate::arithmetic::Add) -> Self { + Self::Add(::std::boxed::Box::new(value)) + } +} + +impl ::std::convert::From:: for crate::arithmetic::Expression { + fn from(value: crate::arithmetic::Const) -> Self { + Self::Const(value) + } +} + +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct Add { + pub left: crate::arithmetic::Expression, + pub right: crate::arithmetic::Expression, +} + +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct Const { + pub value: ::core::primitive::i32, +} diff --git a/examples/06-inductive-data-types/output/rust/src/lib.rs b/examples/06-inductive-data-types/output/rust/src/lib.rs new file mode 100644 index 0000000..3265e69 --- /dev/null +++ b/examples/06-inductive-data-types/output/rust/src/lib.rs @@ -0,0 +1,33 @@ +mod arithmetic; + +use arithmetic::{Const, Expression}; + +fn eval(expression: &Expression) -> i32 { + match expression { + Expression::Add(add) => + eval(&add.left) + eval(&add.right), + + Expression::Const(Const { value }) => + *value, + } +} + +#[cfg(test)] +mod test { + use super::arithmetic::{Add, Const, Expression}; + + #[test] + fn eval() { + let expression: Expression = Add { + left: Add { + left: Const { value: 42 }.into(), + right: Const { value: 47 }.into(), + }.into(), + right: Const { value: 52 }.into(), + }.into(); + + let result = super::eval(&expression); + + assert_eq!(result, 141); + } +} diff --git a/examples/06-inductive-data-types/src/arithmetic.hob b/examples/06-inductive-data-types/src/arithmetic.hob new file mode 100644 index 0000000..d3b2051 --- /dev/null +++ b/examples/06-inductive-data-types/src/arithmetic.hob @@ -0,0 +1,13 @@ +sum Expression { + variant Box[Add]; + variant Const; +} + +struct Add { + field left: Expression; + field right: Expression; +} + +struct Const { + field value: Int32; +} -- cgit v1.2.3