summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-24 23:04:36 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-24 23:04:36 +0100
commitd145fa46f2571d530d55937cf7907cced0a30347 (patch)
tree0d71fa29e6d07a4f449031ee1a1a163a5b4b818e
parent6b3ca8e95a46fbf6f4d9bc5b4214386dd221c69c (diff)
Support Shared in rust-transient-0
-rw-r--r--examples/11-transient-0/output/rust/src/gen/data/transient_0.rs4
-rw-r--r--examples/11-transient-0/output/rust/src/lib.rs14
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java22
3 files changed, 37 insertions, 3 deletions
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
index 12f69e8..52ae7e1 100644
--- 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
@@ -223,11 +223,11 @@ pub fn decode_struct_with_sum(reader: &mut impl std::io::Read) -> ::std::io::Res
}
pub fn encode_struct_with_shared(value: &crate::data::StructWithShared, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> {
- todo!();
+ crate::data::transient_0::encode_struct_with_int_32((&value.inner).as_ref(), writer)?;
::std::io::Result::Ok(())
}
pub fn decode_struct_with_shared(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::StructWithShared> {
- let inner = todo!();
+ let inner = ::std::sync::Arc::new(crate::data::transient_0::decode_struct_with_int_32(reader)?);
std::io::Result::Ok(crate::data::StructWithShared { inner: inner })
}
diff --git a/examples/11-transient-0/output/rust/src/lib.rs b/examples/11-transient-0/output/rust/src/lib.rs
index e31e1fb..6368af2 100644
--- a/examples/11-transient-0/output/rust/src/lib.rs
+++ b/examples/11-transient-0/output/rust/src/lib.rs
@@ -4,7 +4,8 @@ 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 };
+ use std::sync::Arc;
+ use super::data::{EnumWithVariants, StructWithBool, StructWithEnum, StructWithInt32, StructWithInt64, StructWithList, StructWithOption, StructWithShared, StructWithString, StructWithStruct, StructWithSum, SumWithVariants, VariantOne, VariantTwo };
#[test]
fn struct_with_bool() {
@@ -168,6 +169,17 @@ mod test {
);
}
+ #[test]
+ fn struct_with_shared() {
+ let value = StructWithShared { inner: Arc::new(StructWithInt32 { a: 10, b: 25 }) };
+
+ assert_round_trip_encoding(
+ value,
+ super::data::transient_0::encode_struct_with_shared,
+ super::data::transient_0::decode_struct_with_shared,
+ );
+ }
+
fn assert_round_trip_encoding<T: std::cmp::PartialEq + std::fmt::Debug>(
value: T,
encode: impl Fn(&T, &mut Cursor<Vec<u8>>) -> std::io::Result<()>,
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java
index 72fff82..9a3ef32 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java
@@ -552,6 +552,8 @@ public class RustTransient0Generator implements Generator {
yield generateEncodeList(value, constructedNativeType.args().getFirst());
} else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) {
yield generateEncodeOption(value, constructedNativeType.args().getFirst());
+ } else if (constructedNativeType.constructor().equals(NativeTypes.SHARED)) {
+ yield generateEncodeShared(value, constructedNativeType.args().getFirst());
} else {
yield new RustExpressionStatement(generateTodo());
}
@@ -590,6 +592,8 @@ public class RustTransient0Generator implements Generator {
yield generateDecodeList(constructedNativeType.args().getFirst());
} else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) {
yield generateDecodeOption(constructedNativeType.args().getFirst());
+ } else if (constructedNativeType.constructor().equals(NativeTypes.SHARED)) {
+ yield generateDecodeShared(constructedNativeType.args().getFirst());
} else {
yield generateTodo();
}
@@ -778,6 +782,24 @@ public class RustTransient0Generator implements Generator {
);
}
+ private RustStatement generateEncodeShared(RustExpression value, Type type) {
+ return generateEncode(
+ new RustCallExpression(
+ new RustFieldExpression(value, RustIdentifier.of("as_ref")),
+ List.of()
+ ),
+ type
+ );
+ }
+
+ private RustExpression generateDecodeShared(Type type) {
+ var value = generateDecode(type);
+ return new RustCallExpression(
+ RustPath.global("std", "sync", "Arc", "new"),
+ List.of(value)
+ );
+ }
+
private RustExpression generateWriterWrite(RustExpression valueToWrite) {
return new RustTryPropagationExpression(new RustCallExpression(
new RustFieldExpression(