From 2bc23bdc7fe01fc5921be8e09f405a8a1fd7bd65 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 24 Jul 2026 17:59:45 +0100 Subject: Add Shared type --- examples/08-custom-code/hobgoblin.json5 | 19 -- examples/08-custom-code/output/java/.gitignore | 2 - examples/08-custom-code/output/java/pom.xml | 1 - .../org/zwobble/example/types/shapes/Square.java | 33 --- .../test/java/org/zwobble/example/ShapesTests.java | 13 -- examples/08-custom-code/output/rust/.gitignore | 1 - examples/08-custom-code/output/rust/Cargo.lock | 7 - examples/08-custom-code/output/rust/Cargo.toml | 6 - .../08-custom-code/output/rust/rust-toolchain.toml | 2 - .../08-custom-code/output/rust/src/gen/shapes.rs | 6 - examples/08-custom-code/output/rust/src/lib.rs | 12 -- examples/08-custom-code/output/rust/src/shapes.rs | 7 - examples/08-custom-code/src/shapes.hob | 3 - examples/08-shared/hobgoblin.json5 | 19 ++ examples/08-shared/output/java/.gitignore | 2 + examples/08-shared/output/java/pom.xml | 1 + .../test/java/org/zwobble/example/PointTests.java | 16 ++ examples/08-shared/src/point.hob | 11 + examples/09-custom-code/hobgoblin.json5 | 19 ++ examples/09-custom-code/output/java/.gitignore | 2 + examples/09-custom-code/output/java/pom.xml | 1 + .../org/zwobble/example/types/shapes/Square.java | 33 +++ .../test/java/org/zwobble/example/ShapesTests.java | 13 ++ examples/09-custom-code/output/rust/.gitignore | 1 + examples/09-custom-code/output/rust/Cargo.lock | 7 + examples/09-custom-code/output/rust/Cargo.toml | 6 + .../09-custom-code/output/rust/rust-toolchain.toml | 2 + .../09-custom-code/output/rust/src/gen/shapes.rs | 6 + examples/09-custom-code/output/rust/src/lib.rs | 12 ++ examples/09-custom-code/output/rust/src/shapes.rs | 7 + examples/09-custom-code/src/shapes.hob | 3 + examples/09-imports/hobgoblin.json5 | 19 -- examples/09-imports/output/java/.gitignore | 2 - examples/09-imports/output/java/pom.xml | 1 - .../test/java/org/zwobble/example/LineTests.java | 15 -- examples/09-imports/output/rust/.gitignore | 1 - examples/09-imports/output/rust/Cargo.lock | 7 - examples/09-imports/output/rust/Cargo.toml | 6 - .../09-imports/output/rust/rust-toolchain.toml | 2 - examples/09-imports/output/rust/src/lib.rs | 15 -- examples/09-imports/output/rust/src/line.rs | 8 - examples/09-imports/output/rust/src/point.rs | 8 - examples/09-imports/src/line.hob | 7 - examples/09-imports/src/point.hob | 5 - examples/10-imports/hobgoblin.json5 | 19 ++ examples/10-imports/output/java/.gitignore | 2 + examples/10-imports/output/java/pom.xml | 1 + .../test/java/org/zwobble/example/LineTests.java | 15 ++ examples/10-imports/output/rust/.gitignore | 1 + examples/10-imports/output/rust/Cargo.lock | 7 + examples/10-imports/output/rust/Cargo.toml | 6 + .../10-imports/output/rust/rust-toolchain.toml | 2 + examples/10-imports/output/rust/src/lib.rs | 15 ++ examples/10-imports/output/rust/src/line.rs | 8 + examples/10-imports/output/rust/src/point.rs | 8 + examples/10-imports/src/line.hob | 7 + examples/10-imports/src/point.hob | 5 + examples/10-transient-0/hobgoblin.json5 | 27 --- examples/10-transient-0/output/java/.gitignore | 2 - examples/10-transient-0/output/java/pom.xml | 1 - .../java/org/zwobble/example/Transient0Tests.java | 214 -------------------- examples/10-transient-0/output/rust/.gitignore | 1 - examples/10-transient-0/output/rust/Cargo.lock | 7 - examples/10-transient-0/output/rust/Cargo.toml | 6 - .../10-transient-0/output/rust/rust-toolchain.toml | 2 - examples/10-transient-0/output/rust/src/data.rs | 5 - .../10-transient-0/output/rust/src/gen/data.rs | 90 --------- .../output/rust/src/gen/data/transient_0.rs | 223 --------------------- .../output/rust/src/gen/transient_0.rs | 70 ------- examples/10-transient-0/output/rust/src/lib.rs | 184 ----------------- .../10-transient-0/output/rust/src/transient_0.rs | 1 - examples/10-transient-0/src/data.hob | 63 ------ examples/11-transient-0/hobgoblin.json5 | 27 +++ examples/11-transient-0/output/java/.gitignore | 2 + examples/11-transient-0/output/java/pom.xml | 1 + .../java/org/zwobble/example/Transient0Tests.java | 214 ++++++++++++++++++++ examples/11-transient-0/output/rust/.gitignore | 1 + examples/11-transient-0/output/rust/Cargo.lock | 7 + examples/11-transient-0/output/rust/Cargo.toml | 6 + .../11-transient-0/output/rust/rust-toolchain.toml | 2 + examples/11-transient-0/output/rust/src/data.rs | 5 + .../11-transient-0/output/rust/src/gen/data.rs | 90 +++++++++ .../output/rust/src/gen/data/transient_0.rs | 223 +++++++++++++++++++++ .../output/rust/src/gen/transient_0.rs | 70 +++++++ examples/11-transient-0/output/rust/src/lib.rs | 184 +++++++++++++++++ .../11-transient-0/output/rust/src/transient_0.rs | 1 + examples/11-transient-0/src/data.hob | 63 ++++++ 87 files changed, 1153 insertions(+), 1104 deletions(-) delete mode 100644 examples/08-custom-code/hobgoblin.json5 delete mode 100644 examples/08-custom-code/output/java/.gitignore delete mode 120000 examples/08-custom-code/output/java/pom.xml delete mode 100644 examples/08-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java delete mode 100644 examples/08-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java delete mode 100644 examples/08-custom-code/output/rust/.gitignore delete mode 100644 examples/08-custom-code/output/rust/Cargo.lock delete mode 100644 examples/08-custom-code/output/rust/Cargo.toml delete mode 100644 examples/08-custom-code/output/rust/rust-toolchain.toml delete mode 100644 examples/08-custom-code/output/rust/src/gen/shapes.rs delete mode 100644 examples/08-custom-code/output/rust/src/lib.rs delete mode 100644 examples/08-custom-code/output/rust/src/shapes.rs delete mode 100644 examples/08-custom-code/src/shapes.hob create mode 100644 examples/08-shared/hobgoblin.json5 create mode 100644 examples/08-shared/output/java/.gitignore create mode 120000 examples/08-shared/output/java/pom.xml create mode 100644 examples/08-shared/output/java/src/test/java/org/zwobble/example/PointTests.java create mode 100644 examples/08-shared/src/point.hob create mode 100644 examples/09-custom-code/hobgoblin.json5 create mode 100644 examples/09-custom-code/output/java/.gitignore create mode 120000 examples/09-custom-code/output/java/pom.xml create mode 100644 examples/09-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java create mode 100644 examples/09-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java create mode 100644 examples/09-custom-code/output/rust/.gitignore create mode 100644 examples/09-custom-code/output/rust/Cargo.lock create mode 100644 examples/09-custom-code/output/rust/Cargo.toml create mode 100644 examples/09-custom-code/output/rust/rust-toolchain.toml create mode 100644 examples/09-custom-code/output/rust/src/gen/shapes.rs create mode 100644 examples/09-custom-code/output/rust/src/lib.rs create mode 100644 examples/09-custom-code/output/rust/src/shapes.rs create mode 100644 examples/09-custom-code/src/shapes.hob delete mode 100644 examples/09-imports/hobgoblin.json5 delete mode 100644 examples/09-imports/output/java/.gitignore delete mode 120000 examples/09-imports/output/java/pom.xml delete mode 100644 examples/09-imports/output/java/src/test/java/org/zwobble/example/LineTests.java delete mode 100644 examples/09-imports/output/rust/.gitignore delete mode 100644 examples/09-imports/output/rust/Cargo.lock delete mode 100644 examples/09-imports/output/rust/Cargo.toml delete mode 100644 examples/09-imports/output/rust/rust-toolchain.toml delete mode 100644 examples/09-imports/output/rust/src/lib.rs delete mode 100644 examples/09-imports/output/rust/src/line.rs delete mode 100644 examples/09-imports/output/rust/src/point.rs delete mode 100644 examples/09-imports/src/line.hob delete mode 100644 examples/09-imports/src/point.hob create mode 100644 examples/10-imports/hobgoblin.json5 create mode 100644 examples/10-imports/output/java/.gitignore create mode 120000 examples/10-imports/output/java/pom.xml create mode 100644 examples/10-imports/output/java/src/test/java/org/zwobble/example/LineTests.java create mode 100644 examples/10-imports/output/rust/.gitignore create mode 100644 examples/10-imports/output/rust/Cargo.lock create mode 100644 examples/10-imports/output/rust/Cargo.toml create mode 100644 examples/10-imports/output/rust/rust-toolchain.toml create mode 100644 examples/10-imports/output/rust/src/lib.rs create mode 100644 examples/10-imports/output/rust/src/line.rs create mode 100644 examples/10-imports/output/rust/src/point.rs create mode 100644 examples/10-imports/src/line.hob create mode 100644 examples/10-imports/src/point.hob delete mode 100644 examples/10-transient-0/hobgoblin.json5 delete mode 100644 examples/10-transient-0/output/java/.gitignore delete mode 120000 examples/10-transient-0/output/java/pom.xml delete mode 100644 examples/10-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java delete mode 100644 examples/10-transient-0/output/rust/.gitignore delete mode 100644 examples/10-transient-0/output/rust/Cargo.lock delete mode 100644 examples/10-transient-0/output/rust/Cargo.toml delete mode 100644 examples/10-transient-0/output/rust/rust-toolchain.toml delete mode 100644 examples/10-transient-0/output/rust/src/data.rs delete mode 100644 examples/10-transient-0/output/rust/src/gen/data.rs delete mode 100644 examples/10-transient-0/output/rust/src/gen/data/transient_0.rs delete mode 100644 examples/10-transient-0/output/rust/src/gen/transient_0.rs delete mode 100644 examples/10-transient-0/output/rust/src/lib.rs delete mode 100644 examples/10-transient-0/output/rust/src/transient_0.rs delete mode 100644 examples/10-transient-0/src/data.hob create mode 100644 examples/11-transient-0/hobgoblin.json5 create mode 100644 examples/11-transient-0/output/java/.gitignore create mode 120000 examples/11-transient-0/output/java/pom.xml create mode 100644 examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java create mode 100644 examples/11-transient-0/output/rust/.gitignore create mode 100644 examples/11-transient-0/output/rust/Cargo.lock create mode 100644 examples/11-transient-0/output/rust/Cargo.toml create mode 100644 examples/11-transient-0/output/rust/rust-toolchain.toml create mode 100644 examples/11-transient-0/output/rust/src/data.rs create mode 100644 examples/11-transient-0/output/rust/src/gen/data.rs create mode 100644 examples/11-transient-0/output/rust/src/gen/data/transient_0.rs create mode 100644 examples/11-transient-0/output/rust/src/gen/transient_0.rs create mode 100644 examples/11-transient-0/output/rust/src/lib.rs create mode 100644 examples/11-transient-0/output/rust/src/transient_0.rs create mode 100644 examples/11-transient-0/src/data.hob (limited to 'examples') diff --git a/examples/08-custom-code/hobgoblin.json5 b/examples/08-custom-code/hobgoblin.json5 deleted file mode 100644 index 1d08a40..0000000 --- a/examples/08-custom-code/hobgoblin.json5 +++ /dev/null @@ -1,19 +0,0 @@ -{ - outputs: { - langs: { - java: { - packageName: "org.zwobble.example.types", - }, - }, - generators: [ - { - generator: "java-types", - path: "output/java/src/main/java", - }, - { - generator: "rust-types", - path: "output/rust/src/gen", - }, - ], - }, -} diff --git a/examples/08-custom-code/output/java/.gitignore b/examples/08-custom-code/output/java/.gitignore deleted file mode 100644 index ff511d4..0000000 --- a/examples/08-custom-code/output/java/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/src/gen/ -/target/ diff --git a/examples/08-custom-code/output/java/pom.xml b/examples/08-custom-code/output/java/pom.xml deleted file mode 120000 index 445fa65..0000000 --- a/examples/08-custom-code/output/java/pom.xml +++ /dev/null @@ -1 +0,0 @@ -../../../templates/java-junit/pom.xml \ No newline at end of file diff --git a/examples/08-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java b/examples/08-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java deleted file mode 100644 index 169d729..0000000 --- a/examples/08-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java +++ /dev/null @@ -1,33 +0,0 @@ -// Generated by hobgoblin. - -package org.zwobble.example.types.shapes; - -// Custom area start: org.zwobble.example.types.shapes.Square imports -// Custom area end: org.zwobble.example.types.shapes.Square imports - -public record Square(int width) { - public static org.zwobble.example.types.shapes.Square.Builder arbitrary() { - return new org.zwobble.example.types.shapes.Square.Builder(0); - } - - public record Builder(int width) { - public org.zwobble.example.types.shapes.Square build() { - return new org.zwobble.example.types.shapes.Square(width); - } - - public org.zwobble.example.types.shapes.Square.Builder withWidth(int width) { - return new org.zwobble.example.types.shapes.Square.Builder(width); - } - - // Custom area start: org.zwobble.example.types.shapes.Square.Builder body - // Custom area end: org.zwobble.example.types.shapes.Square.Builder body - } - - // Custom area start: org.zwobble.example.types.shapes.Square body - - public int area() { - return this.width * this.width; - } - - // Custom area end: org.zwobble.example.types.shapes.Square body -} diff --git a/examples/08-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java b/examples/08-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java deleted file mode 100644 index fba8e6c..0000000 --- a/examples/08-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.zwobble.example; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; -import org.zwobble.example.types.shapes.Square; - -public class ShapesTests { - @Test - public void canUseCustomCode() { - Square square = new Square(10); - assertEquals(square.area(), 100); - } -} diff --git a/examples/08-custom-code/output/rust/.gitignore b/examples/08-custom-code/output/rust/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/examples/08-custom-code/output/rust/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/examples/08-custom-code/output/rust/Cargo.lock b/examples/08-custom-code/output/rust/Cargo.lock deleted file mode 100644 index 9dc6e3e..0000000 --- a/examples/08-custom-code/output/rust/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# 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/08-custom-code/output/rust/Cargo.toml b/examples/08-custom-code/output/rust/Cargo.toml deleted file mode 100644 index 5d4c622..0000000 --- a/examples/08-custom-code/output/rust/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "example" -version = "0.1.0" -edition = "2024" - -[dependencies] diff --git a/examples/08-custom-code/output/rust/rust-toolchain.toml b/examples/08-custom-code/output/rust/rust-toolchain.toml deleted file mode 100644 index 4fedb95..0000000 --- a/examples/08-custom-code/output/rust/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "1.96" diff --git a/examples/08-custom-code/output/rust/src/gen/shapes.rs b/examples/08-custom-code/output/rust/src/gen/shapes.rs deleted file mode 100644 index c5f8af5..0000000 --- a/examples/08-custom-code/output/rust/src/gen/shapes.rs +++ /dev/null @@ -1,6 +0,0 @@ -// Generated by hobgoblin. - -#[derive(Debug, PartialEq)] -pub struct Square { - pub width: ::core::primitive::i32, -} diff --git a/examples/08-custom-code/output/rust/src/lib.rs b/examples/08-custom-code/output/rust/src/lib.rs deleted file mode 100644 index 1825d72..0000000 --- a/examples/08-custom-code/output/rust/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -mod shapes; - -#[cfg(test)] -mod test { - use super::shapes::Square; - - #[test] - fn can_use_custom_code() { - let square = Square { width: 10 }; - assert_eq!(square.area(), 100); - } -} diff --git a/examples/08-custom-code/output/rust/src/shapes.rs b/examples/08-custom-code/output/rust/src/shapes.rs deleted file mode 100644 index f806bbb..0000000 --- a/examples/08-custom-code/output/rust/src/shapes.rs +++ /dev/null @@ -1,7 +0,0 @@ -include!("gen/shapes.rs"); - -impl Square { - pub fn area(&self) -> i32 { - self.width * self.width - } -} diff --git a/examples/08-custom-code/src/shapes.hob b/examples/08-custom-code/src/shapes.hob deleted file mode 100644 index 5dfe833..0000000 --- a/examples/08-custom-code/src/shapes.hob +++ /dev/null @@ -1,3 +0,0 @@ -struct Square { - field width: Int32; -} diff --git a/examples/08-shared/hobgoblin.json5 b/examples/08-shared/hobgoblin.json5 new file mode 100644 index 0000000..f9f6597 --- /dev/null +++ b/examples/08-shared/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: "java-precisely-matchers", + path: "output/java/src/gen/java", + }, + ], + } +} diff --git a/examples/08-shared/output/java/.gitignore b/examples/08-shared/output/java/.gitignore new file mode 100644 index 0000000..ff511d4 --- /dev/null +++ b/examples/08-shared/output/java/.gitignore @@ -0,0 +1,2 @@ +/src/gen/ +/target/ diff --git a/examples/08-shared/output/java/pom.xml b/examples/08-shared/output/java/pom.xml new file mode 120000 index 0000000..445fa65 --- /dev/null +++ b/examples/08-shared/output/java/pom.xml @@ -0,0 +1 @@ +../../../templates/java-junit/pom.xml \ No newline at end of file diff --git a/examples/08-shared/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/08-shared/output/java/src/test/java/org/zwobble/example/PointTests.java new file mode 100644 index 0000000..18a1961 --- /dev/null +++ b/examples/08-shared/output/java/src/test/java/org/zwobble/example/PointTests.java @@ -0,0 +1,16 @@ +package org.zwobble.example; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.zwobble.example.types.point.Point; + +public class PointTests { + @Test + public void pointFields() { + Point point = new Point(10, 25); + int x = point.x(); + int y = point.y(); + assertEquals(x, 10); + assertEquals(y, 25); + } +} diff --git a/examples/08-shared/src/point.hob b/examples/08-shared/src/point.hob new file mode 100644 index 0000000..7b9a8e6 --- /dev/null +++ b/examples/08-shared/src/point.hob @@ -0,0 +1,11 @@ +/// A straight line from one point to another. +struct Line { + field start: Shared[Point]; + field end: Shared[Point]; +} + +/// A 2D point. +struct Point { + field x: Int32; + field y: Int32; +} diff --git a/examples/09-custom-code/hobgoblin.json5 b/examples/09-custom-code/hobgoblin.json5 new file mode 100644 index 0000000..1d08a40 --- /dev/null +++ b/examples/09-custom-code/hobgoblin.json5 @@ -0,0 +1,19 @@ +{ + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, + }, + generators: [ + { + generator: "java-types", + path: "output/java/src/main/java", + }, + { + generator: "rust-types", + path: "output/rust/src/gen", + }, + ], + }, +} diff --git a/examples/09-custom-code/output/java/.gitignore b/examples/09-custom-code/output/java/.gitignore new file mode 100644 index 0000000..ff511d4 --- /dev/null +++ b/examples/09-custom-code/output/java/.gitignore @@ -0,0 +1,2 @@ +/src/gen/ +/target/ diff --git a/examples/09-custom-code/output/java/pom.xml b/examples/09-custom-code/output/java/pom.xml new file mode 120000 index 0000000..445fa65 --- /dev/null +++ b/examples/09-custom-code/output/java/pom.xml @@ -0,0 +1 @@ +../../../templates/java-junit/pom.xml \ No newline at end of file diff --git a/examples/09-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java b/examples/09-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java new file mode 100644 index 0000000..169d729 --- /dev/null +++ b/examples/09-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java @@ -0,0 +1,33 @@ +// Generated by hobgoblin. + +package org.zwobble.example.types.shapes; + +// Custom area start: org.zwobble.example.types.shapes.Square imports +// Custom area end: org.zwobble.example.types.shapes.Square imports + +public record Square(int width) { + public static org.zwobble.example.types.shapes.Square.Builder arbitrary() { + return new org.zwobble.example.types.shapes.Square.Builder(0); + } + + public record Builder(int width) { + public org.zwobble.example.types.shapes.Square build() { + return new org.zwobble.example.types.shapes.Square(width); + } + + public org.zwobble.example.types.shapes.Square.Builder withWidth(int width) { + return new org.zwobble.example.types.shapes.Square.Builder(width); + } + + // Custom area start: org.zwobble.example.types.shapes.Square.Builder body + // Custom area end: org.zwobble.example.types.shapes.Square.Builder body + } + + // Custom area start: org.zwobble.example.types.shapes.Square body + + public int area() { + return this.width * this.width; + } + + // Custom area end: org.zwobble.example.types.shapes.Square body +} diff --git a/examples/09-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java b/examples/09-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java new file mode 100644 index 0000000..fba8e6c --- /dev/null +++ b/examples/09-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java @@ -0,0 +1,13 @@ +package org.zwobble.example; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.zwobble.example.types.shapes.Square; + +public class ShapesTests { + @Test + public void canUseCustomCode() { + Square square = new Square(10); + assertEquals(square.area(), 100); + } +} diff --git a/examples/09-custom-code/output/rust/.gitignore b/examples/09-custom-code/output/rust/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/examples/09-custom-code/output/rust/.gitignore @@ -0,0 +1 @@ +/target diff --git a/examples/09-custom-code/output/rust/Cargo.lock b/examples/09-custom-code/output/rust/Cargo.lock new file mode 100644 index 0000000..9dc6e3e --- /dev/null +++ b/examples/09-custom-code/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/09-custom-code/output/rust/Cargo.toml b/examples/09-custom-code/output/rust/Cargo.toml new file mode 100644 index 0000000..5d4c622 --- /dev/null +++ b/examples/09-custom-code/output/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "example" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/examples/09-custom-code/output/rust/rust-toolchain.toml b/examples/09-custom-code/output/rust/rust-toolchain.toml new file mode 100644 index 0000000..4fedb95 --- /dev/null +++ b/examples/09-custom-code/output/rust/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.96" diff --git a/examples/09-custom-code/output/rust/src/gen/shapes.rs b/examples/09-custom-code/output/rust/src/gen/shapes.rs new file mode 100644 index 0000000..c5f8af5 --- /dev/null +++ b/examples/09-custom-code/output/rust/src/gen/shapes.rs @@ -0,0 +1,6 @@ +// Generated by hobgoblin. + +#[derive(Debug, PartialEq)] +pub struct Square { + pub width: ::core::primitive::i32, +} diff --git a/examples/09-custom-code/output/rust/src/lib.rs b/examples/09-custom-code/output/rust/src/lib.rs new file mode 100644 index 0000000..1825d72 --- /dev/null +++ b/examples/09-custom-code/output/rust/src/lib.rs @@ -0,0 +1,12 @@ +mod shapes; + +#[cfg(test)] +mod test { + use super::shapes::Square; + + #[test] + fn can_use_custom_code() { + let square = Square { width: 10 }; + assert_eq!(square.area(), 100); + } +} diff --git a/examples/09-custom-code/output/rust/src/shapes.rs b/examples/09-custom-code/output/rust/src/shapes.rs new file mode 100644 index 0000000..f806bbb --- /dev/null +++ b/examples/09-custom-code/output/rust/src/shapes.rs @@ -0,0 +1,7 @@ +include!("gen/shapes.rs"); + +impl Square { + pub fn area(&self) -> i32 { + self.width * self.width + } +} diff --git a/examples/09-custom-code/src/shapes.hob b/examples/09-custom-code/src/shapes.hob new file mode 100644 index 0000000..5dfe833 --- /dev/null +++ b/examples/09-custom-code/src/shapes.hob @@ -0,0 +1,3 @@ +struct Square { + field width: Int32; +} diff --git a/examples/09-imports/hobgoblin.json5 b/examples/09-imports/hobgoblin.json5 deleted file mode 100644 index 12713d4..0000000 --- a/examples/09-imports/hobgoblin.json5 +++ /dev/null @@ -1,19 +0,0 @@ -{ - 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/09-imports/output/java/.gitignore b/examples/09-imports/output/java/.gitignore deleted file mode 100644 index ff511d4..0000000 --- a/examples/09-imports/output/java/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/src/gen/ -/target/ diff --git a/examples/09-imports/output/java/pom.xml b/examples/09-imports/output/java/pom.xml deleted file mode 120000 index 445fa65..0000000 --- a/examples/09-imports/output/java/pom.xml +++ /dev/null @@ -1 +0,0 @@ -../../../templates/java-junit/pom.xml \ No newline at end of file diff --git a/examples/09-imports/output/java/src/test/java/org/zwobble/example/LineTests.java b/examples/09-imports/output/java/src/test/java/org/zwobble/example/LineTests.java deleted file mode 100644 index c376b19..0000000 --- a/examples/09-imports/output/java/src/test/java/org/zwobble/example/LineTests.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.zwobble.example; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; -import org.zwobble.example.types.line.Line; -import org.zwobble.example.types.point.Point; - -public class LineTests { - @Test - public void canConstructLine() { - Point start = new Point(10, 25); - Point end = new Point(25, 10); - Line line = new Line(start, end); - } -} diff --git a/examples/09-imports/output/rust/.gitignore b/examples/09-imports/output/rust/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/examples/09-imports/output/rust/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/examples/09-imports/output/rust/Cargo.lock b/examples/09-imports/output/rust/Cargo.lock deleted file mode 100644 index 9dc6e3e..0000000 --- a/examples/09-imports/output/rust/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# 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/09-imports/output/rust/Cargo.toml b/examples/09-imports/output/rust/Cargo.toml deleted file mode 100644 index 5d4c622..0000000 --- a/examples/09-imports/output/rust/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "example" -version = "0.1.0" -edition = "2024" - -[dependencies] diff --git a/examples/09-imports/output/rust/rust-toolchain.toml b/examples/09-imports/output/rust/rust-toolchain.toml deleted file mode 100644 index 4fedb95..0000000 --- a/examples/09-imports/output/rust/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "1.96" diff --git a/examples/09-imports/output/rust/src/lib.rs b/examples/09-imports/output/rust/src/lib.rs deleted file mode 100644 index ffbcbf4..0000000 --- a/examples/09-imports/output/rust/src/lib.rs +++ /dev/null @@ -1,15 +0,0 @@ -mod line; -mod point; - -#[cfg(test)] -mod test { - use super::line::Line; - use super::point::Point; - - #[test] - fn can_construct_line() { - let start = Point { x: 10, y: 25 }; - let end = Point { x: 10, y: 25 }; - let line = Line { start, end }; - } -} diff --git a/examples/09-imports/output/rust/src/line.rs b/examples/09-imports/output/rust/src/line.rs deleted file mode 100644 index e29c94b..0000000 --- a/examples/09-imports/output/rust/src/line.rs +++ /dev/null @@ -1,8 +0,0 @@ -// 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 deleted file mode 100644 index a0ca4c7..0000000 --- a/examples/09-imports/output/rust/src/point.rs +++ /dev/null @@ -1,8 +0,0 @@ -// 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/09-imports/src/line.hob b/examples/09-imports/src/line.hob deleted file mode 100644 index 562d77f..0000000 --- a/examples/09-imports/src/line.hob +++ /dev/null @@ -1,7 +0,0 @@ -import {Point} from ./point; - -/// A straight line from one point to another. -struct Line { - field start: Point; - field end: Point; -} diff --git a/examples/09-imports/src/point.hob b/examples/09-imports/src/point.hob deleted file mode 100644 index 87f9953..0000000 --- a/examples/09-imports/src/point.hob +++ /dev/null @@ -1,5 +0,0 @@ -/// A 2D point. -struct Point { - field x: Int32; - field y: Int32; -} diff --git a/examples/10-imports/hobgoblin.json5 b/examples/10-imports/hobgoblin.json5 new file mode 100644 index 0000000..12713d4 --- /dev/null +++ b/examples/10-imports/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/10-imports/output/java/.gitignore b/examples/10-imports/output/java/.gitignore new file mode 100644 index 0000000..ff511d4 --- /dev/null +++ b/examples/10-imports/output/java/.gitignore @@ -0,0 +1,2 @@ +/src/gen/ +/target/ diff --git a/examples/10-imports/output/java/pom.xml b/examples/10-imports/output/java/pom.xml new file mode 120000 index 0000000..445fa65 --- /dev/null +++ b/examples/10-imports/output/java/pom.xml @@ -0,0 +1 @@ +../../../templates/java-junit/pom.xml \ No newline at end of file diff --git a/examples/10-imports/output/java/src/test/java/org/zwobble/example/LineTests.java b/examples/10-imports/output/java/src/test/java/org/zwobble/example/LineTests.java new file mode 100644 index 0000000..c376b19 --- /dev/null +++ b/examples/10-imports/output/java/src/test/java/org/zwobble/example/LineTests.java @@ -0,0 +1,15 @@ +package org.zwobble.example; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.zwobble.example.types.line.Line; +import org.zwobble.example.types.point.Point; + +public class LineTests { + @Test + public void canConstructLine() { + Point start = new Point(10, 25); + Point end = new Point(25, 10); + Line line = new Line(start, end); + } +} diff --git a/examples/10-imports/output/rust/.gitignore b/examples/10-imports/output/rust/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/examples/10-imports/output/rust/.gitignore @@ -0,0 +1 @@ +/target diff --git a/examples/10-imports/output/rust/Cargo.lock b/examples/10-imports/output/rust/Cargo.lock new file mode 100644 index 0000000..9dc6e3e --- /dev/null +++ b/examples/10-imports/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/10-imports/output/rust/Cargo.toml b/examples/10-imports/output/rust/Cargo.toml new file mode 100644 index 0000000..5d4c622 --- /dev/null +++ b/examples/10-imports/output/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "example" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/examples/10-imports/output/rust/rust-toolchain.toml b/examples/10-imports/output/rust/rust-toolchain.toml new file mode 100644 index 0000000..4fedb95 --- /dev/null +++ b/examples/10-imports/output/rust/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.96" diff --git a/examples/10-imports/output/rust/src/lib.rs b/examples/10-imports/output/rust/src/lib.rs new file mode 100644 index 0000000..ffbcbf4 --- /dev/null +++ b/examples/10-imports/output/rust/src/lib.rs @@ -0,0 +1,15 @@ +mod line; +mod point; + +#[cfg(test)] +mod test { + use super::line::Line; + use super::point::Point; + + #[test] + fn can_construct_line() { + let start = Point { x: 10, y: 25 }; + let end = Point { x: 10, y: 25 }; + let line = Line { start, end }; + } +} diff --git a/examples/10-imports/output/rust/src/line.rs b/examples/10-imports/output/rust/src/line.rs new file mode 100644 index 0000000..e29c94b --- /dev/null +++ b/examples/10-imports/output/rust/src/line.rs @@ -0,0 +1,8 @@ +// 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/10-imports/output/rust/src/point.rs b/examples/10-imports/output/rust/src/point.rs new file mode 100644 index 0000000..a0ca4c7 --- /dev/null +++ b/examples/10-imports/output/rust/src/point.rs @@ -0,0 +1,8 @@ +// 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-imports/src/line.hob b/examples/10-imports/src/line.hob new file mode 100644 index 0000000..562d77f --- /dev/null +++ b/examples/10-imports/src/line.hob @@ -0,0 +1,7 @@ +import {Point} from ./point; + +/// A straight line from one point to another. +struct Line { + field start: Point; + field end: Point; +} diff --git a/examples/10-imports/src/point.hob b/examples/10-imports/src/point.hob new file mode 100644 index 0000000..87f9953 --- /dev/null +++ b/examples/10-imports/src/point.hob @@ -0,0 +1,5 @@ +/// A 2D point. +struct Point { + field x: Int32; + field y: Int32; +} diff --git a/examples/10-transient-0/hobgoblin.json5 b/examples/10-transient-0/hobgoblin.json5 deleted file mode 100644 index 2160c60..0000000 --- a/examples/10-transient-0/hobgoblin.json5 +++ /dev/null @@ -1,27 +0,0 @@ -{ - outputs: { - langs: { - java: { - packageName: "org.zwobble.example.types", - }, - }, - generators: [ - { - generator: "java-types", - path: "output/java/src/gen/java", - }, - { - generator: "java-transient-0", - path: "output/java/src/gen/java", - }, - { - generator: "rust-types", - path: "output/rust/src/gen", - }, - { - generator: "rust-transient-0", - path: "output/rust/src/gen", - } - ], - } -} diff --git a/examples/10-transient-0/output/java/.gitignore b/examples/10-transient-0/output/java/.gitignore deleted file mode 100644 index ff511d4..0000000 --- a/examples/10-transient-0/output/java/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/src/gen/ -/target/ diff --git a/examples/10-transient-0/output/java/pom.xml b/examples/10-transient-0/output/java/pom.xml deleted file mode 120000 index 445fa65..0000000 --- a/examples/10-transient-0/output/java/pom.xml +++ /dev/null @@ -1 +0,0 @@ -../../../templates/java-junit/pom.xml \ No newline at end of file diff --git a/examples/10-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/10-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java deleted file mode 100644 index 6369f93..0000000 --- a/examples/10-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java +++ /dev/null @@ -1,214 +0,0 @@ -package org.zwobble.example; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.List; -import java.util.Optional; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.zwobble.example.types.data.EnumWithVariants; -import org.zwobble.example.types.data.HobgoblinTransient0Data; -import org.zwobble.example.types.data.StructWithBool; -import org.zwobble.example.types.data.StructWithEnum; -import org.zwobble.example.types.data.StructWithInt32; -import org.zwobble.example.types.data.StructWithInt64; -import org.zwobble.example.types.data.StructWithList; -import org.zwobble.example.types.data.StructWithOption; -import org.zwobble.example.types.data.StructWithString; -import org.zwobble.example.types.data.StructWithStruct; -import org.zwobble.example.types.data.StructWithSum; -import org.zwobble.example.types.data.VariantOne; -import org.zwobble.example.types.data.VariantTwo; - -public class Transient0Tests { - @Test - public void structWithBool() throws IOException { - var value = new StructWithBool(true, false); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithBool, - HobgoblinTransient0Data::decodeStructWithBool - ); - } - - @Test - public void structWithInt32() throws IOException { - var value = new StructWithInt32(10, 25); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithInt32, - HobgoblinTransient0Data::decodeStructWithInt32 - ); - } - - @Test - public void structWithInt64() throws IOException { - var value = new StructWithInt64(10, 25); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithInt64, - HobgoblinTransient0Data::decodeStructWithInt64 - ); - } - - @Test - public void structWithString() throws IOException { - var value = new StructWithString("abc", "def"); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithString, - HobgoblinTransient0Data::decodeStructWithString - ); - } - - @Test - public void structWithStruct() throws IOException { - var value = new StructWithStruct(new StructWithInt32(10, 25), 42); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithStruct, - HobgoblinTransient0Data::decodeStructWithStruct - ); - } - - @Test - public void structWithList() throws IOException { - var value = new StructWithList( - List.of(10L, 25L), - List.of( - new StructWithInt32(42, 47), - new StructWithInt32(52, 57), - new StructWithInt32(62, 67) - ) - ); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithList, - HobgoblinTransient0Data::decodeStructWithList - ); - } - - @Test - public void structWithOptionNone() throws IOException { - var value = new StructWithOption( - Optional.empty(), - Optional.empty() - ); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithOption, - HobgoblinTransient0Data::decodeStructWithOption - ); - } - - @Test - public void structWithOptionSome() throws IOException { - var value = new StructWithOption( - Optional.of(10L), - Optional.of(new StructWithInt32(42, 47)) - ); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithOption, - HobgoblinTransient0Data::decodeStructWithOption - ); - } - - @Test - public void enumWithVariants() throws IOException { - assertRoundTripEncoding( - EnumWithVariants.ZERO, - HobgoblinTransient0Data::encodeEnumWithVariants, - HobgoblinTransient0Data::decodeEnumWithVariants - ); - - assertRoundTripEncoding( - EnumWithVariants.ONE, - HobgoblinTransient0Data::encodeEnumWithVariants, - HobgoblinTransient0Data::decodeEnumWithVariants - ); - - assertRoundTripEncoding( - EnumWithVariants.TWO, - HobgoblinTransient0Data::encodeEnumWithVariants, - HobgoblinTransient0Data::decodeEnumWithVariants - ); - } - - @Test - public void structWithEnum() throws IOException { - var value = new StructWithEnum( - EnumWithVariants.ONE, - 42 - ); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithEnum, - HobgoblinTransient0Data::decodeStructWithEnum - ); - } - - @Test - public void sumWithVariants() throws IOException { - assertRoundTripEncoding( - new VariantOne(10), - HobgoblinTransient0Data::encodeSumWithVariants, - HobgoblinTransient0Data::decodeSumWithVariants - ); - - assertRoundTripEncoding( - new VariantTwo(25), - HobgoblinTransient0Data::encodeSumWithVariants, - HobgoblinTransient0Data::decodeSumWithVariants - ); - } - - @Test - public void structWithSum() throws IOException { - var value = new StructWithSum( - new VariantTwo(25), - 42 - ); - - assertRoundTripEncoding( - value, - HobgoblinTransient0Data::encodeStructWithSum, - HobgoblinTransient0Data::decodeStructWithSum - ); - } - - private void assertRoundTripEncoding( - T value, - Encoder encoder, - Decoder decoder - ) throws IOException { - var outputStream = new ByteArrayOutputStream(); - encoder.encode(value, outputStream); - var bytes = outputStream.toByteArray(); - - var inputStream = new ByteArrayInputStream(bytes); - var decodedValue = decoder.decode(inputStream); - - Assertions.assertEquals(value, decodedValue); - } - - private interface Encoder { - void encode(T value, OutputStream outputStream) throws IOException; - } - - private interface Decoder { - T decode(InputStream inputStream) throws IOException; - } -} diff --git a/examples/10-transient-0/output/rust/.gitignore b/examples/10-transient-0/output/rust/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/examples/10-transient-0/output/rust/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/examples/10-transient-0/output/rust/Cargo.lock b/examples/10-transient-0/output/rust/Cargo.lock deleted file mode 100644 index 9dc6e3e..0000000 --- a/examples/10-transient-0/output/rust/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# 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/10-transient-0/output/rust/Cargo.toml b/examples/10-transient-0/output/rust/Cargo.toml deleted file mode 100644 index 5d4c622..0000000 --- a/examples/10-transient-0/output/rust/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "example" -version = "0.1.0" -edition = "2024" - -[dependencies] diff --git a/examples/10-transient-0/output/rust/rust-toolchain.toml b/examples/10-transient-0/output/rust/rust-toolchain.toml deleted file mode 100644 index 4fedb95..0000000 --- a/examples/10-transient-0/output/rust/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "1.96" diff --git a/examples/10-transient-0/output/rust/src/data.rs b/examples/10-transient-0/output/rust/src/data.rs deleted file mode 100644 index 7a0c4fa..0000000 --- a/examples/10-transient-0/output/rust/src/data.rs +++ /dev/null @@ -1,5 +0,0 @@ -include!("./gen/data.rs"); - -pub mod transient_0 { - include!("./gen/data/transient_0.rs"); -} diff --git a/examples/10-transient-0/output/rust/src/gen/data.rs b/examples/10-transient-0/output/rust/src/gen/data.rs deleted file mode 100644 index 0ea6c0f..0000000 --- a/examples/10-transient-0/output/rust/src/gen/data.rs +++ /dev/null @@ -1,90 +0,0 @@ -// 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 StructWithStruct { - pub inner: crate::data::StructWithInt32, - pub c: ::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 struct StructWithEnum { - pub inner: crate::data::EnumWithVariants, - pub c: ::core::primitive::i32, -} - -#[derive(Debug, PartialEq)] -pub enum SumWithVariants { - VariantOne(crate::data::VariantOne), - VariantTwo(crate::data::VariantTwo), -} - -impl ::std::convert::From:: for crate::data::SumWithVariants { - fn from(value: crate::data::VariantOne) -> Self { - Self::VariantOne(value) - } -} - -impl ::std::convert::From:: for crate::data::SumWithVariants { - fn from(value: crate::data::VariantTwo) -> Self { - Self::VariantTwo(value) - } -} - -#[derive(Debug, PartialEq)] -pub struct VariantOne { - pub a: ::core::primitive::i32, -} - -#[derive(Debug, PartialEq)] -pub struct VariantTwo { - pub a: ::core::primitive::i64, -} - -#[derive(Debug, PartialEq)] -pub struct StructWithSum { - pub inner: crate::data::SumWithVariants, - pub b: ::core::primitive::i32, -} diff --git a/examples/10-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/10-transient-0/output/rust/src/gen/data/transient_0.rs deleted file mode 100644 index 82fb5f7..0000000 --- a/examples/10-transient-0/output/rust/src/gen/data/transient_0.rs +++ /dev/null @@ -1,223 +0,0 @@ -// Generated by hobgoblin. - -pub fn encode_struct_with_bool(value: &crate::data::StructWithBool, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::transient_0::encode_bool(&value.a, writer)?; - crate::transient_0::encode_bool(&value.b, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_struct_with_bool(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let a = crate::transient_0::decode_bool(reader)?; - let b = crate::transient_0::decode_bool(reader)?; - std::io::Result::Ok(crate::data::StructWithBool { a: a, b: b }) -} - -pub fn encode_struct_with_int_32(value: &crate::data::StructWithInt32, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::transient_0::encode_int_32(&value.a, writer)?; - crate::transient_0::encode_int_32(&value.b, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_struct_with_int_32(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let a = crate::transient_0::decode_int_32(reader)?; - let b = crate::transient_0::decode_int_32(reader)?; - std::io::Result::Ok(crate::data::StructWithInt32 { a: a, b: b }) -} - -pub fn encode_struct_with_int_64(value: &crate::data::StructWithInt64, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::transient_0::encode_int_64(&value.a, writer)?; - crate::transient_0::encode_int_64(&value.b, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_struct_with_int_64(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let a = crate::transient_0::decode_int_64(reader)?; - let b = crate::transient_0::decode_int_64(reader)?; - std::io::Result::Ok(crate::data::StructWithInt64 { a: a, b: b }) -} - -pub fn encode_struct_with_string(value: &crate::data::StructWithString, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::transient_0::encode_string(&value.a, writer)?; - crate::transient_0::encode_string(&value.b, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_struct_with_string(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let a = crate::transient_0::decode_string(reader)?; - let b = crate::transient_0::decode_string(reader)?; - std::io::Result::Ok(crate::data::StructWithString { a: a, b: b }) -} - -pub fn encode_struct_with_struct(value: &crate::data::StructWithStruct, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::data::transient_0::encode_struct_with_int_32(&value.inner, writer)?; - crate::transient_0::encode_int_32(&value.c, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_struct_with_struct(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let inner = crate::data::transient_0::decode_struct_with_int_32(reader)?; - let c = crate::transient_0::decode_int_32(reader)?; - std::io::Result::Ok(crate::data::StructWithStruct { inner: inner, c: c }) -} - -pub fn encode_struct_with_list(value: &crate::data::StructWithList, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - { - crate::transient_0::encode_int_64(&(((&value.a).len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?, writer)?; - for element in &value.a { - crate::transient_0::encode_int_64(element, writer)?; - }; - }; - { - crate::transient_0::encode_int_64(&(((&value.b).len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?, writer)?; - for element in &value.b { - crate::data::transient_0::encode_struct_with_int_32(element, writer)?; - }; - }; - ::std::io::Result::Ok(()) -} - -pub fn decode_struct_with_list(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let a = { - let len = crate::transient_0::decode_int_64(reader)?; - let mut elements = ::std::vec::Vec::with_capacity((len.try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?); - for _ in 0..len { - elements.push(crate::transient_0::decode_int_64(reader)?); - }; - elements - }; - let b = { - let len = crate::transient_0::decode_int_64(reader)?; - let mut elements = ::std::vec::Vec::with_capacity((len.try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?); - for _ in 0..len { - elements.push(crate::data::transient_0::decode_struct_with_int_32(reader)?); - }; - elements - }; - std::io::Result::Ok(crate::data::StructWithList { a: a, b: b }) -} - -pub fn encode_struct_with_option(value: &crate::data::StructWithOption, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - match &value.a { - ::std::option::Option::Some(value) => { - crate::transient_0::encode_bool(&true, writer)?; - crate::transient_0::encode_int_64(&value, writer)?; - }, - ::std::option::Option::None => { - crate::transient_0::encode_bool(&false, writer)?; - }, - }; - match &value.b { - ::std::option::Option::Some(value) => { - crate::transient_0::encode_bool(&true, writer)?; - crate::data::transient_0::encode_struct_with_int_32(&value, writer)?; - }, - ::std::option::Option::None => { - crate::transient_0::encode_bool(&false, writer)?; - }, - }; - ::std::io::Result::Ok(()) -} - -pub fn decode_struct_with_option(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let a = { - let is_some = crate::transient_0::decode_bool(reader)?; - if is_some { - ::std::option::Option::Some(crate::transient_0::decode_int_64(reader)?) - } else { - ::std::option::Option::None - } - }; - let b = { - let is_some = crate::transient_0::decode_bool(reader)?; - if is_some { - ::std::option::Option::Some(crate::data::transient_0::decode_struct_with_int_32(reader)?) - } else { - ::std::option::Option::None - } - }; - std::io::Result::Ok(crate::data::StructWithOption { a: a, b: b }) -} - -pub fn encode_enum_with_variants(value: &crate::data::EnumWithVariants, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::transient_0::encode_int_32(&match value { - crate::data::EnumWithVariants::Zero => 0, - crate::data::EnumWithVariants::One => 1, - crate::data::EnumWithVariants::Two => 2, - }, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_enum_with_variants(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - std::io::Result::Ok(match &crate::transient_0::decode_int_32(reader)? { - 0 => crate::data::EnumWithVariants::Zero, - 1 => crate::data::EnumWithVariants::One, - 2 => crate::data::EnumWithVariants::Two, - _ => todo!(), - }) -} - -pub fn encode_struct_with_enum(value: &crate::data::StructWithEnum, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::data::transient_0::encode_enum_with_variants(&value.inner, writer)?; - crate::transient_0::encode_int_32(&value.c, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_struct_with_enum(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let inner = crate::data::transient_0::decode_enum_with_variants(reader)?; - let c = crate::transient_0::decode_int_32(reader)?; - std::io::Result::Ok(crate::data::StructWithEnum { inner: inner, c: c }) -} - -pub fn encode_sum_with_variants(value: &crate::data::SumWithVariants, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - match value { - crate::data::SumWithVariants::VariantOne(value) => { - crate::transient_0::encode_int_32(&0, writer)?; - crate::data::transient_0::encode_variant_one(value, writer)?; - }, - crate::data::SumWithVariants::VariantTwo(value) => { - crate::transient_0::encode_int_32(&1, writer)?; - crate::data::transient_0::encode_variant_two(value, writer)?; - }, - }; - ::std::io::Result::Ok(()) -} - -pub fn decode_sum_with_variants(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - std::io::Result::Ok(match &crate::transient_0::decode_int_32(reader)? { - 0 => crate::data::SumWithVariants::VariantOne(crate::data::transient_0::decode_variant_one(reader)?), - 1 => crate::data::SumWithVariants::VariantTwo(crate::data::transient_0::decode_variant_two(reader)?), - _ => todo!(), - }) -} - -pub fn encode_variant_one(value: &crate::data::VariantOne, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::transient_0::encode_int_32(&value.a, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_variant_one(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let a = crate::transient_0::decode_int_32(reader)?; - std::io::Result::Ok(crate::data::VariantOne { a: a }) -} - -pub fn encode_variant_two(value: &crate::data::VariantTwo, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::transient_0::encode_int_64(&value.a, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_variant_two(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let a = crate::transient_0::decode_int_64(reader)?; - std::io::Result::Ok(crate::data::VariantTwo { a: a }) -} - -pub fn encode_struct_with_sum(value: &crate::data::StructWithSum, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::data::transient_0::encode_sum_with_variants(&value.inner, writer)?; - crate::transient_0::encode_int_32(&value.b, writer)?; - ::std::io::Result::Ok(()) -} - -pub fn decode_struct_with_sum(reader: &mut impl std::io::Read) -> ::std::io::Result:: { - let inner = crate::data::transient_0::decode_sum_with_variants(reader)?; - let b = crate::transient_0::decode_int_32(reader)?; - std::io::Result::Ok(crate::data::StructWithSum { inner: inner, b: b }) -} diff --git a/examples/10-transient-0/output/rust/src/gen/transient_0.rs b/examples/10-transient-0/output/rust/src/gen/transient_0.rs deleted file mode 100644 index 560fe51..0000000 --- a/examples/10-transient-0/output/rust/src/gen/transient_0.rs +++ /dev/null @@ -1,70 +0,0 @@ -// Generated by hobgoblin. - -pub fn encode_bool(value: &::core::primitive::bool, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - if *value { - writer.write_all(&1u8.to_le_bytes())?; - } else { - writer.write_all(&0u8.to_le_bytes())?; - }; - ::std::io::Result::Ok(()) -} - -pub fn decode_bool(reader: &mut impl std::io::Read) -> ::std::io::Result::<::core::primitive::bool> { - let int_value = { - let bytes = { - let mut bytes = [0; 1]; - reader.read_exact(&mut bytes)?; - bytes - }; - u8::from_le_bytes(bytes) - }; - std::io::Result::Ok(if int_value == 0 { - false - } else { - true - }) -} - -pub fn encode_int_32(value: &::core::primitive::i32, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - writer.write_all(&value.to_le_bytes())?; - ::std::io::Result::Ok(()) -} - -pub fn decode_int_32(reader: &mut impl std::io::Read) -> ::std::io::Result::<::core::primitive::i32> { - let bytes = { - let mut bytes = [0; 4]; - reader.read_exact(&mut bytes)?; - bytes - }; - std::io::Result::Ok(::core::primitive::i32::from_le_bytes(bytes)) -} - -pub fn encode_int_64(value: &::core::primitive::i64, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - writer.write_all(&value.to_le_bytes())?; - ::std::io::Result::Ok(()) -} - -pub fn decode_int_64(reader: &mut impl std::io::Read) -> ::std::io::Result::<::core::primitive::i64> { - let bytes = { - let mut bytes = [0; 8]; - reader.read_exact(&mut bytes)?; - bytes - }; - std::io::Result::Ok(::core::primitive::i64::from_le_bytes(bytes)) -} - -pub fn encode_string(value: &::std::string::String, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - crate::transient_0::encode_int_64(&((value.len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?, writer)?; - writer.write_all(value.as_bytes())?; - ::std::io::Result::Ok(()) -} - -pub fn decode_string(reader: &mut impl std::io::Read) -> ::std::io::Result::<::std::string::String> { - let len = crate::transient_0::decode_int_64(reader)?; - let bytes = { - let mut bytes = vec![0u8; (len.try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?]; - reader.read_exact(&mut bytes)?; - bytes - }; - std::io::Result::Ok((::std::string::String::from_utf8(bytes)).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?) -} diff --git a/examples/10-transient-0/output/rust/src/lib.rs b/examples/10-transient-0/output/rust/src/lib.rs deleted file mode 100644 index e31e1fb..0000000 --- a/examples/10-transient-0/output/rust/src/lib.rs +++ /dev/null @@ -1,184 +0,0 @@ -pub mod data; -pub mod transient_0; - -#[cfg(test)] -mod test { - use std::io::Cursor; - use super::data::{EnumWithVariants, StructWithBool, StructWithEnum, StructWithInt32, StructWithInt64, StructWithList, StructWithOption, StructWithString, StructWithStruct, StructWithSum, SumWithVariants, VariantOne, VariantTwo }; - - #[test] - fn struct_with_bool() { - let value = StructWithBool { a: true, b: false }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_bool, - super::data::transient_0::decode_struct_with_bool, - ); - } - - #[test] - fn struct_with_int_32() { - let value = StructWithInt32 { a: 10, b: 25 }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_int_32, - super::data::transient_0::decode_struct_with_int_32, - ); - } - - #[test] - fn struct_with_int_64() { - let value = StructWithInt64 { a: 10, b: 25 }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_int_64, - super::data::transient_0::decode_struct_with_int_64, - ); - } - - #[test] - fn struct_with_string() { - let value = StructWithString { a: "abc".to_string(), b: "def".to_string() }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_string, - super::data::transient_0::decode_struct_with_string, - ); - } - - #[test] - fn struct_with_struct() { - let value = StructWithStruct { inner: StructWithInt32 { a: 10, b: 25 }, c: 42 }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_struct, - super::data::transient_0::decode_struct_with_struct, - ); - } - - #[test] - fn struct_with_list() { - let value = StructWithList { - a: vec![10, 25], - b: vec![ - StructWithInt32 { a: 42, b: 47 }, - StructWithInt32 { a: 52, b: 57 }, - StructWithInt32 { a: 62, b: 67 }, - ], - }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_list, - super::data::transient_0::decode_struct_with_list, - ); - } - - #[test] - fn struct_with_option_none() { - let value = StructWithOption { - a: None, - b: None, - }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_option, - super::data::transient_0::decode_struct_with_option, - ); - } - - #[test] - fn struct_with_option_some() { - let value = StructWithOption { - a: Some(10), - b: Some(StructWithInt32 { a: 42, b: 47 }), - }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_option, - super::data::transient_0::decode_struct_with_option, - ); - } - - #[test] - fn enum_with_variants() { - assert_round_trip_encoding( - EnumWithVariants::Zero, - super::data::transient_0::encode_enum_with_variants, - super::data::transient_0::decode_enum_with_variants, - ); - - assert_round_trip_encoding( - EnumWithVariants::One, - super::data::transient_0::encode_enum_with_variants, - super::data::transient_0::decode_enum_with_variants, - ); - - assert_round_trip_encoding( - EnumWithVariants::Two, - super::data::transient_0::encode_enum_with_variants, - super::data::transient_0::decode_enum_with_variants, - ); - } - - #[test] - fn struct_with_enum() { - let value = StructWithEnum { inner: EnumWithVariants::One, c: 42 }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_enum, - super::data::transient_0::decode_struct_with_enum, - ); - } - - #[test] - fn sum_with_variants() { - assert_round_trip_encoding( - SumWithVariants::VariantOne(VariantOne { a: 10 }), - super::data::transient_0::encode_sum_with_variants, - super::data::transient_0::decode_sum_with_variants, - ); - - assert_round_trip_encoding( - SumWithVariants::VariantTwo(VariantTwo { a: 25 }), - super::data::transient_0::encode_sum_with_variants, - super::data::transient_0::decode_sum_with_variants, - ); - } - - #[test] - fn struct_with_sum() { - let value = StructWithSum { - inner: SumWithVariants::VariantTwo(VariantTwo { a: 25 }), - b: 42, - }; - - assert_round_trip_encoding( - value, - super::data::transient_0::encode_struct_with_sum, - super::data::transient_0::decode_struct_with_sum, - ); - } - - fn assert_round_trip_encoding( - value: T, - encode: impl Fn(&T, &mut Cursor>) -> std::io::Result<()>, - decode: impl Fn(&mut Cursor>) -> std::io::Result, - ) { - let mut bytes = Cursor::new(Vec::new()); - encode(&value, &mut bytes).unwrap(); - - bytes.set_position(0); - let decoded_value = decode(&mut bytes).unwrap(); - - assert_eq!(value, decoded_value); - } -} diff --git a/examples/10-transient-0/output/rust/src/transient_0.rs b/examples/10-transient-0/output/rust/src/transient_0.rs deleted file mode 100644 index 8b2b800..0000000 --- a/examples/10-transient-0/output/rust/src/transient_0.rs +++ /dev/null @@ -1 +0,0 @@ -include!("./gen/transient_0.rs"); diff --git a/examples/10-transient-0/src/data.hob b/examples/10-transient-0/src/data.hob deleted file mode 100644 index bbfd882..0000000 --- a/examples/10-transient-0/src/data.hob +++ /dev/null @@ -1,63 +0,0 @@ -struct StructWithBool { - field a: Bool; - field b: Bool; -} - -struct StructWithInt32 { - field a: Int32; - field b: Int32; -} - -struct StructWithInt64 { - field a: Int64; - field b: Int64; -} - -struct StructWithString { - field a: String; - field b: String; -} - -struct StructWithStruct { - field inner: StructWithInt32; - field c: Int32; -} - -struct StructWithList { - field a: List[Int64]; - field b: List[StructWithInt32]; -} - -struct StructWithOption { - field a: Option[Int64]; - field b: Option[StructWithInt32]; -} - -enum EnumWithVariants { - variant zero; - variant one; - variant two; -} - -struct StructWithEnum { - field inner: EnumWithVariants; - field c: Int32; -} - -sum SumWithVariants { - variant VariantOne; - variant VariantTwo; -} - -struct VariantOne { - field a: Int32; -} - -struct VariantTwo { - field a: Int64; -} - -struct StructWithSum { - field inner: SumWithVariants; - field b: Int32; -} diff --git a/examples/11-transient-0/hobgoblin.json5 b/examples/11-transient-0/hobgoblin.json5 new file mode 100644 index 0000000..2160c60 --- /dev/null +++ b/examples/11-transient-0/hobgoblin.json5 @@ -0,0 +1,27 @@ +{ + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, + }, + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "java-transient-0", + path: "output/java/src/gen/java", + }, + { + generator: "rust-types", + path: "output/rust/src/gen", + }, + { + generator: "rust-transient-0", + path: "output/rust/src/gen", + } + ], + } +} diff --git a/examples/11-transient-0/output/java/.gitignore b/examples/11-transient-0/output/java/.gitignore new file mode 100644 index 0000000..ff511d4 --- /dev/null +++ b/examples/11-transient-0/output/java/.gitignore @@ -0,0 +1,2 @@ +/src/gen/ +/target/ diff --git a/examples/11-transient-0/output/java/pom.xml b/examples/11-transient-0/output/java/pom.xml new file mode 120000 index 0000000..445fa65 --- /dev/null +++ b/examples/11-transient-0/output/java/pom.xml @@ -0,0 +1 @@ +../../../templates/java-junit/pom.xml \ No newline at end of file diff --git a/examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java new file mode 100644 index 0000000..6369f93 --- /dev/null +++ b/examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java @@ -0,0 +1,214 @@ +package org.zwobble.example; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.zwobble.example.types.data.EnumWithVariants; +import org.zwobble.example.types.data.HobgoblinTransient0Data; +import org.zwobble.example.types.data.StructWithBool; +import org.zwobble.example.types.data.StructWithEnum; +import org.zwobble.example.types.data.StructWithInt32; +import org.zwobble.example.types.data.StructWithInt64; +import org.zwobble.example.types.data.StructWithList; +import org.zwobble.example.types.data.StructWithOption; +import org.zwobble.example.types.data.StructWithString; +import org.zwobble.example.types.data.StructWithStruct; +import org.zwobble.example.types.data.StructWithSum; +import org.zwobble.example.types.data.VariantOne; +import org.zwobble.example.types.data.VariantTwo; + +public class Transient0Tests { + @Test + public void structWithBool() throws IOException { + var value = new StructWithBool(true, false); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithBool, + HobgoblinTransient0Data::decodeStructWithBool + ); + } + + @Test + public void structWithInt32() throws IOException { + var value = new StructWithInt32(10, 25); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithInt32, + HobgoblinTransient0Data::decodeStructWithInt32 + ); + } + + @Test + public void structWithInt64() throws IOException { + var value = new StructWithInt64(10, 25); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithInt64, + HobgoblinTransient0Data::decodeStructWithInt64 + ); + } + + @Test + public void structWithString() throws IOException { + var value = new StructWithString("abc", "def"); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithString, + HobgoblinTransient0Data::decodeStructWithString + ); + } + + @Test + public void structWithStruct() throws IOException { + var value = new StructWithStruct(new StructWithInt32(10, 25), 42); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithStruct, + HobgoblinTransient0Data::decodeStructWithStruct + ); + } + + @Test + public void structWithList() throws IOException { + var value = new StructWithList( + List.of(10L, 25L), + List.of( + new StructWithInt32(42, 47), + new StructWithInt32(52, 57), + new StructWithInt32(62, 67) + ) + ); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithList, + HobgoblinTransient0Data::decodeStructWithList + ); + } + + @Test + public void structWithOptionNone() throws IOException { + var value = new StructWithOption( + Optional.empty(), + Optional.empty() + ); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithOption, + HobgoblinTransient0Data::decodeStructWithOption + ); + } + + @Test + public void structWithOptionSome() throws IOException { + var value = new StructWithOption( + Optional.of(10L), + Optional.of(new StructWithInt32(42, 47)) + ); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithOption, + HobgoblinTransient0Data::decodeStructWithOption + ); + } + + @Test + public void enumWithVariants() throws IOException { + assertRoundTripEncoding( + EnumWithVariants.ZERO, + HobgoblinTransient0Data::encodeEnumWithVariants, + HobgoblinTransient0Data::decodeEnumWithVariants + ); + + assertRoundTripEncoding( + EnumWithVariants.ONE, + HobgoblinTransient0Data::encodeEnumWithVariants, + HobgoblinTransient0Data::decodeEnumWithVariants + ); + + assertRoundTripEncoding( + EnumWithVariants.TWO, + HobgoblinTransient0Data::encodeEnumWithVariants, + HobgoblinTransient0Data::decodeEnumWithVariants + ); + } + + @Test + public void structWithEnum() throws IOException { + var value = new StructWithEnum( + EnumWithVariants.ONE, + 42 + ); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithEnum, + HobgoblinTransient0Data::decodeStructWithEnum + ); + } + + @Test + public void sumWithVariants() throws IOException { + assertRoundTripEncoding( + new VariantOne(10), + HobgoblinTransient0Data::encodeSumWithVariants, + HobgoblinTransient0Data::decodeSumWithVariants + ); + + assertRoundTripEncoding( + new VariantTwo(25), + HobgoblinTransient0Data::encodeSumWithVariants, + HobgoblinTransient0Data::decodeSumWithVariants + ); + } + + @Test + public void structWithSum() throws IOException { + var value = new StructWithSum( + new VariantTwo(25), + 42 + ); + + assertRoundTripEncoding( + value, + HobgoblinTransient0Data::encodeStructWithSum, + HobgoblinTransient0Data::decodeStructWithSum + ); + } + + private void assertRoundTripEncoding( + T value, + Encoder encoder, + Decoder decoder + ) throws IOException { + var outputStream = new ByteArrayOutputStream(); + encoder.encode(value, outputStream); + var bytes = outputStream.toByteArray(); + + var inputStream = new ByteArrayInputStream(bytes); + var decodedValue = decoder.decode(inputStream); + + Assertions.assertEquals(value, decodedValue); + } + + private interface Encoder { + void encode(T value, OutputStream outputStream) throws IOException; + } + + private interface Decoder { + T decode(InputStream inputStream) throws IOException; + } +} diff --git a/examples/11-transient-0/output/rust/.gitignore b/examples/11-transient-0/output/rust/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/examples/11-transient-0/output/rust/.gitignore @@ -0,0 +1 @@ +/target diff --git a/examples/11-transient-0/output/rust/Cargo.lock b/examples/11-transient-0/output/rust/Cargo.lock new file mode 100644 index 0000000..9dc6e3e --- /dev/null +++ b/examples/11-transient-0/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/11-transient-0/output/rust/Cargo.toml b/examples/11-transient-0/output/rust/Cargo.toml new file mode 100644 index 0000000..5d4c622 --- /dev/null +++ b/examples/11-transient-0/output/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "example" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/examples/11-transient-0/output/rust/rust-toolchain.toml b/examples/11-transient-0/output/rust/rust-toolchain.toml new file mode 100644 index 0000000..4fedb95 --- /dev/null +++ b/examples/11-transient-0/output/rust/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.96" diff --git a/examples/11-transient-0/output/rust/src/data.rs b/examples/11-transient-0/output/rust/src/data.rs new file mode 100644 index 0000000..7a0c4fa --- /dev/null +++ b/examples/11-transient-0/output/rust/src/data.rs @@ -0,0 +1,5 @@ +include!("./gen/data.rs"); + +pub mod transient_0 { + include!("./gen/data/transient_0.rs"); +} diff --git a/examples/11-transient-0/output/rust/src/gen/data.rs b/examples/11-transient-0/output/rust/src/gen/data.rs new file mode 100644 index 0000000..0ea6c0f --- /dev/null +++ b/examples/11-transient-0/output/rust/src/gen/data.rs @@ -0,0 +1,90 @@ +// 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 StructWithStruct { + pub inner: crate::data::StructWithInt32, + pub c: ::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 struct StructWithEnum { + pub inner: crate::data::EnumWithVariants, + pub c: ::core::primitive::i32, +} + +#[derive(Debug, PartialEq)] +pub enum SumWithVariants { + VariantOne(crate::data::VariantOne), + VariantTwo(crate::data::VariantTwo), +} + +impl ::std::convert::From:: for crate::data::SumWithVariants { + fn from(value: crate::data::VariantOne) -> Self { + Self::VariantOne(value) + } +} + +impl ::std::convert::From:: for crate::data::SumWithVariants { + fn from(value: crate::data::VariantTwo) -> Self { + Self::VariantTwo(value) + } +} + +#[derive(Debug, PartialEq)] +pub struct VariantOne { + pub a: ::core::primitive::i32, +} + +#[derive(Debug, PartialEq)] +pub struct VariantTwo { + pub a: ::core::primitive::i64, +} + +#[derive(Debug, PartialEq)] +pub struct StructWithSum { + pub inner: crate::data::SumWithVariants, + pub b: ::core::primitive::i32, +} diff --git a/examples/11-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/11-transient-0/output/rust/src/gen/data/transient_0.rs new file mode 100644 index 0000000..82fb5f7 --- /dev/null +++ b/examples/11-transient-0/output/rust/src/gen/data/transient_0.rs @@ -0,0 +1,223 @@ +// Generated by hobgoblin. + +pub fn encode_struct_with_bool(value: &crate::data::StructWithBool, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::transient_0::encode_bool(&value.a, writer)?; + crate::transient_0::encode_bool(&value.b, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_bool(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let a = crate::transient_0::decode_bool(reader)?; + let b = crate::transient_0::decode_bool(reader)?; + std::io::Result::Ok(crate::data::StructWithBool { a: a, b: b }) +} + +pub fn encode_struct_with_int_32(value: &crate::data::StructWithInt32, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::transient_0::encode_int_32(&value.a, writer)?; + crate::transient_0::encode_int_32(&value.b, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_int_32(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let a = crate::transient_0::decode_int_32(reader)?; + let b = crate::transient_0::decode_int_32(reader)?; + std::io::Result::Ok(crate::data::StructWithInt32 { a: a, b: b }) +} + +pub fn encode_struct_with_int_64(value: &crate::data::StructWithInt64, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::transient_0::encode_int_64(&value.a, writer)?; + crate::transient_0::encode_int_64(&value.b, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_int_64(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let a = crate::transient_0::decode_int_64(reader)?; + let b = crate::transient_0::decode_int_64(reader)?; + std::io::Result::Ok(crate::data::StructWithInt64 { a: a, b: b }) +} + +pub fn encode_struct_with_string(value: &crate::data::StructWithString, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::transient_0::encode_string(&value.a, writer)?; + crate::transient_0::encode_string(&value.b, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_string(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let a = crate::transient_0::decode_string(reader)?; + let b = crate::transient_0::decode_string(reader)?; + std::io::Result::Ok(crate::data::StructWithString { a: a, b: b }) +} + +pub fn encode_struct_with_struct(value: &crate::data::StructWithStruct, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::data::transient_0::encode_struct_with_int_32(&value.inner, writer)?; + crate::transient_0::encode_int_32(&value.c, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_struct(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let inner = crate::data::transient_0::decode_struct_with_int_32(reader)?; + let c = crate::transient_0::decode_int_32(reader)?; + std::io::Result::Ok(crate::data::StructWithStruct { inner: inner, c: c }) +} + +pub fn encode_struct_with_list(value: &crate::data::StructWithList, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + { + crate::transient_0::encode_int_64(&(((&value.a).len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?, writer)?; + for element in &value.a { + crate::transient_0::encode_int_64(element, writer)?; + }; + }; + { + crate::transient_0::encode_int_64(&(((&value.b).len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?, writer)?; + for element in &value.b { + crate::data::transient_0::encode_struct_with_int_32(element, writer)?; + }; + }; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_list(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let a = { + let len = crate::transient_0::decode_int_64(reader)?; + let mut elements = ::std::vec::Vec::with_capacity((len.try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?); + for _ in 0..len { + elements.push(crate::transient_0::decode_int_64(reader)?); + }; + elements + }; + let b = { + let len = crate::transient_0::decode_int_64(reader)?; + let mut elements = ::std::vec::Vec::with_capacity((len.try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?); + for _ in 0..len { + elements.push(crate::data::transient_0::decode_struct_with_int_32(reader)?); + }; + elements + }; + std::io::Result::Ok(crate::data::StructWithList { a: a, b: b }) +} + +pub fn encode_struct_with_option(value: &crate::data::StructWithOption, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + match &value.a { + ::std::option::Option::Some(value) => { + crate::transient_0::encode_bool(&true, writer)?; + crate::transient_0::encode_int_64(&value, writer)?; + }, + ::std::option::Option::None => { + crate::transient_0::encode_bool(&false, writer)?; + }, + }; + match &value.b { + ::std::option::Option::Some(value) => { + crate::transient_0::encode_bool(&true, writer)?; + crate::data::transient_0::encode_struct_with_int_32(&value, writer)?; + }, + ::std::option::Option::None => { + crate::transient_0::encode_bool(&false, writer)?; + }, + }; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_option(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let a = { + let is_some = crate::transient_0::decode_bool(reader)?; + if is_some { + ::std::option::Option::Some(crate::transient_0::decode_int_64(reader)?) + } else { + ::std::option::Option::None + } + }; + let b = { + let is_some = crate::transient_0::decode_bool(reader)?; + if is_some { + ::std::option::Option::Some(crate::data::transient_0::decode_struct_with_int_32(reader)?) + } else { + ::std::option::Option::None + } + }; + std::io::Result::Ok(crate::data::StructWithOption { a: a, b: b }) +} + +pub fn encode_enum_with_variants(value: &crate::data::EnumWithVariants, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::transient_0::encode_int_32(&match value { + crate::data::EnumWithVariants::Zero => 0, + crate::data::EnumWithVariants::One => 1, + crate::data::EnumWithVariants::Two => 2, + }, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_enum_with_variants(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + std::io::Result::Ok(match &crate::transient_0::decode_int_32(reader)? { + 0 => crate::data::EnumWithVariants::Zero, + 1 => crate::data::EnumWithVariants::One, + 2 => crate::data::EnumWithVariants::Two, + _ => todo!(), + }) +} + +pub fn encode_struct_with_enum(value: &crate::data::StructWithEnum, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::data::transient_0::encode_enum_with_variants(&value.inner, writer)?; + crate::transient_0::encode_int_32(&value.c, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_enum(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let inner = crate::data::transient_0::decode_enum_with_variants(reader)?; + let c = crate::transient_0::decode_int_32(reader)?; + std::io::Result::Ok(crate::data::StructWithEnum { inner: inner, c: c }) +} + +pub fn encode_sum_with_variants(value: &crate::data::SumWithVariants, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + match value { + crate::data::SumWithVariants::VariantOne(value) => { + crate::transient_0::encode_int_32(&0, writer)?; + crate::data::transient_0::encode_variant_one(value, writer)?; + }, + crate::data::SumWithVariants::VariantTwo(value) => { + crate::transient_0::encode_int_32(&1, writer)?; + crate::data::transient_0::encode_variant_two(value, writer)?; + }, + }; + ::std::io::Result::Ok(()) +} + +pub fn decode_sum_with_variants(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + std::io::Result::Ok(match &crate::transient_0::decode_int_32(reader)? { + 0 => crate::data::SumWithVariants::VariantOne(crate::data::transient_0::decode_variant_one(reader)?), + 1 => crate::data::SumWithVariants::VariantTwo(crate::data::transient_0::decode_variant_two(reader)?), + _ => todo!(), + }) +} + +pub fn encode_variant_one(value: &crate::data::VariantOne, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::transient_0::encode_int_32(&value.a, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_variant_one(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let a = crate::transient_0::decode_int_32(reader)?; + std::io::Result::Ok(crate::data::VariantOne { a: a }) +} + +pub fn encode_variant_two(value: &crate::data::VariantTwo, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::transient_0::encode_int_64(&value.a, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_variant_two(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let a = crate::transient_0::decode_int_64(reader)?; + std::io::Result::Ok(crate::data::VariantTwo { a: a }) +} + +pub fn encode_struct_with_sum(value: &crate::data::StructWithSum, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::data::transient_0::encode_sum_with_variants(&value.inner, writer)?; + crate::transient_0::encode_int_32(&value.b, writer)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_sum(reader: &mut impl std::io::Read) -> ::std::io::Result:: { + let inner = crate::data::transient_0::decode_sum_with_variants(reader)?; + let b = crate::transient_0::decode_int_32(reader)?; + std::io::Result::Ok(crate::data::StructWithSum { inner: inner, b: b }) +} diff --git a/examples/11-transient-0/output/rust/src/gen/transient_0.rs b/examples/11-transient-0/output/rust/src/gen/transient_0.rs new file mode 100644 index 0000000..560fe51 --- /dev/null +++ b/examples/11-transient-0/output/rust/src/gen/transient_0.rs @@ -0,0 +1,70 @@ +// Generated by hobgoblin. + +pub fn encode_bool(value: &::core::primitive::bool, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + if *value { + writer.write_all(&1u8.to_le_bytes())?; + } else { + writer.write_all(&0u8.to_le_bytes())?; + }; + ::std::io::Result::Ok(()) +} + +pub fn decode_bool(reader: &mut impl std::io::Read) -> ::std::io::Result::<::core::primitive::bool> { + let int_value = { + let bytes = { + let mut bytes = [0; 1]; + reader.read_exact(&mut bytes)?; + bytes + }; + u8::from_le_bytes(bytes) + }; + std::io::Result::Ok(if int_value == 0 { + false + } else { + true + }) +} + +pub fn encode_int_32(value: &::core::primitive::i32, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + writer.write_all(&value.to_le_bytes())?; + ::std::io::Result::Ok(()) +} + +pub fn decode_int_32(reader: &mut impl std::io::Read) -> ::std::io::Result::<::core::primitive::i32> { + let bytes = { + let mut bytes = [0; 4]; + reader.read_exact(&mut bytes)?; + bytes + }; + std::io::Result::Ok(::core::primitive::i32::from_le_bytes(bytes)) +} + +pub fn encode_int_64(value: &::core::primitive::i64, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + writer.write_all(&value.to_le_bytes())?; + ::std::io::Result::Ok(()) +} + +pub fn decode_int_64(reader: &mut impl std::io::Read) -> ::std::io::Result::<::core::primitive::i64> { + let bytes = { + let mut bytes = [0; 8]; + reader.read_exact(&mut bytes)?; + bytes + }; + std::io::Result::Ok(::core::primitive::i64::from_le_bytes(bytes)) +} + +pub fn encode_string(value: &::std::string::String, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { + crate::transient_0::encode_int_64(&((value.len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?, writer)?; + writer.write_all(value.as_bytes())?; + ::std::io::Result::Ok(()) +} + +pub fn decode_string(reader: &mut impl std::io::Read) -> ::std::io::Result::<::std::string::String> { + let len = crate::transient_0::decode_int_64(reader)?; + let bytes = { + let mut bytes = vec![0u8; (len.try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?]; + reader.read_exact(&mut bytes)?; + bytes + }; + std::io::Result::Ok((::std::string::String::from_utf8(bytes)).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?) +} diff --git a/examples/11-transient-0/output/rust/src/lib.rs b/examples/11-transient-0/output/rust/src/lib.rs new file mode 100644 index 0000000..e31e1fb --- /dev/null +++ b/examples/11-transient-0/output/rust/src/lib.rs @@ -0,0 +1,184 @@ +pub mod data; +pub mod transient_0; + +#[cfg(test)] +mod test { + use std::io::Cursor; + use super::data::{EnumWithVariants, StructWithBool, StructWithEnum, StructWithInt32, StructWithInt64, StructWithList, StructWithOption, StructWithString, StructWithStruct, StructWithSum, SumWithVariants, VariantOne, VariantTwo }; + + #[test] + fn struct_with_bool() { + let value = StructWithBool { a: true, b: false }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_bool, + super::data::transient_0::decode_struct_with_bool, + ); + } + + #[test] + fn struct_with_int_32() { + let value = StructWithInt32 { a: 10, b: 25 }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_int_32, + super::data::transient_0::decode_struct_with_int_32, + ); + } + + #[test] + fn struct_with_int_64() { + let value = StructWithInt64 { a: 10, b: 25 }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_int_64, + super::data::transient_0::decode_struct_with_int_64, + ); + } + + #[test] + fn struct_with_string() { + let value = StructWithString { a: "abc".to_string(), b: "def".to_string() }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_string, + super::data::transient_0::decode_struct_with_string, + ); + } + + #[test] + fn struct_with_struct() { + let value = StructWithStruct { inner: StructWithInt32 { a: 10, b: 25 }, c: 42 }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_struct, + super::data::transient_0::decode_struct_with_struct, + ); + } + + #[test] + fn struct_with_list() { + let value = StructWithList { + a: vec![10, 25], + b: vec![ + StructWithInt32 { a: 42, b: 47 }, + StructWithInt32 { a: 52, b: 57 }, + StructWithInt32 { a: 62, b: 67 }, + ], + }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_list, + super::data::transient_0::decode_struct_with_list, + ); + } + + #[test] + fn struct_with_option_none() { + let value = StructWithOption { + a: None, + b: None, + }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_option, + super::data::transient_0::decode_struct_with_option, + ); + } + + #[test] + fn struct_with_option_some() { + let value = StructWithOption { + a: Some(10), + b: Some(StructWithInt32 { a: 42, b: 47 }), + }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_option, + super::data::transient_0::decode_struct_with_option, + ); + } + + #[test] + fn enum_with_variants() { + assert_round_trip_encoding( + EnumWithVariants::Zero, + super::data::transient_0::encode_enum_with_variants, + super::data::transient_0::decode_enum_with_variants, + ); + + assert_round_trip_encoding( + EnumWithVariants::One, + super::data::transient_0::encode_enum_with_variants, + super::data::transient_0::decode_enum_with_variants, + ); + + assert_round_trip_encoding( + EnumWithVariants::Two, + super::data::transient_0::encode_enum_with_variants, + super::data::transient_0::decode_enum_with_variants, + ); + } + + #[test] + fn struct_with_enum() { + let value = StructWithEnum { inner: EnumWithVariants::One, c: 42 }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_enum, + super::data::transient_0::decode_struct_with_enum, + ); + } + + #[test] + fn sum_with_variants() { + assert_round_trip_encoding( + SumWithVariants::VariantOne(VariantOne { a: 10 }), + super::data::transient_0::encode_sum_with_variants, + super::data::transient_0::decode_sum_with_variants, + ); + + assert_round_trip_encoding( + SumWithVariants::VariantTwo(VariantTwo { a: 25 }), + super::data::transient_0::encode_sum_with_variants, + super::data::transient_0::decode_sum_with_variants, + ); + } + + #[test] + fn struct_with_sum() { + let value = StructWithSum { + inner: SumWithVariants::VariantTwo(VariantTwo { a: 25 }), + b: 42, + }; + + assert_round_trip_encoding( + value, + super::data::transient_0::encode_struct_with_sum, + super::data::transient_0::decode_struct_with_sum, + ); + } + + fn assert_round_trip_encoding( + value: T, + encode: impl Fn(&T, &mut Cursor>) -> std::io::Result<()>, + decode: impl Fn(&mut Cursor>) -> std::io::Result, + ) { + let mut bytes = Cursor::new(Vec::new()); + encode(&value, &mut bytes).unwrap(); + + bytes.set_position(0); + let decoded_value = decode(&mut bytes).unwrap(); + + assert_eq!(value, decoded_value); + } +} diff --git a/examples/11-transient-0/output/rust/src/transient_0.rs b/examples/11-transient-0/output/rust/src/transient_0.rs new file mode 100644 index 0000000..8b2b800 --- /dev/null +++ b/examples/11-transient-0/output/rust/src/transient_0.rs @@ -0,0 +1 @@ +include!("./gen/transient_0.rs"); diff --git a/examples/11-transient-0/src/data.hob b/examples/11-transient-0/src/data.hob new file mode 100644 index 0000000..bbfd882 --- /dev/null +++ b/examples/11-transient-0/src/data.hob @@ -0,0 +1,63 @@ +struct StructWithBool { + field a: Bool; + field b: Bool; +} + +struct StructWithInt32 { + field a: Int32; + field b: Int32; +} + +struct StructWithInt64 { + field a: Int64; + field b: Int64; +} + +struct StructWithString { + field a: String; + field b: String; +} + +struct StructWithStruct { + field inner: StructWithInt32; + field c: Int32; +} + +struct StructWithList { + field a: List[Int64]; + field b: List[StructWithInt32]; +} + +struct StructWithOption { + field a: Option[Int64]; + field b: Option[StructWithInt32]; +} + +enum EnumWithVariants { + variant zero; + variant one; + variant two; +} + +struct StructWithEnum { + field inner: EnumWithVariants; + field c: Int32; +} + +sum SumWithVariants { + variant VariantOne; + variant VariantTwo; +} + +struct VariantOne { + field a: Int32; +} + +struct VariantTwo { + field a: Int64; +} + +struct StructWithSum { + field inner: SumWithVariants; + field b: Int32; +} -- cgit v1.2.3