summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/10-transient-0/output/rust/src/gen/data/transient_0.rs126
-rw-r--r--examples/10-transient-0/output/rust/src/gen/transient_0.rs36
-rw-r--r--examples/10-transient-0/output/rust/src/lib.rs8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java35
4 files changed, 115 insertions, 90 deletions
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
index 318e4c6..bfc7c75 100644
--- 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
@@ -1,107 +1,117 @@
// Generated by hobgoblin.
-pub fn encode_struct_with_bool(value: &crate::data::StructWithBool, writer: &mut impl std::io::Write) {
- crate::transient_0::encode_bool(&value.a, writer);
- crate::transient_0::encode_bool(&value.b, writer);
+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) -> crate::data::StructWithBool {
- let a = crate::transient_0::decode_bool(reader);
- let b = crate::transient_0::decode_bool(reader);
- crate::data::StructWithBool { a: a, b: b }
+pub fn decode_struct_with_bool(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::StructWithBool> {
+ 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) {
- crate::transient_0::encode_int_32(&value.a, writer);
- crate::transient_0::encode_int_32(&value.b, writer);
+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) -> crate::data::StructWithInt32 {
- let a = crate::transient_0::decode_int_32(reader);
- let b = crate::transient_0::decode_int_32(reader);
- crate::data::StructWithInt32 { a: a, b: b }
+pub fn decode_struct_with_int_32(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::StructWithInt32> {
+ 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) {
- crate::transient_0::encode_int_64(&value.a, writer);
- crate::transient_0::encode_int_64(&value.b, writer);
+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) -> crate::data::StructWithInt64 {
- let a = crate::transient_0::decode_int_64(reader);
- let b = crate::transient_0::decode_int_64(reader);
- crate::data::StructWithInt64 { a: a, b: b }
+pub fn decode_struct_with_int_64(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::StructWithInt64> {
+ 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) {
- crate::transient_0::encode_string(&value.a, writer);
- crate::transient_0::encode_string(&value.b, writer);
+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) -> crate::data::StructWithString {
- let a = crate::transient_0::decode_string(reader);
- let b = crate::transient_0::decode_string(reader);
- crate::data::StructWithString { a: a, b: b }
+pub fn decode_struct_with_string(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::StructWithString> {
+ 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_outer_struct(value: &crate::data::OuterStruct, writer: &mut impl std::io::Write) {
- crate::data::transient_0::encode_inner_struct(&value.inner, writer);
- crate::transient_0::encode_int_32(&value.c, writer);
+pub fn encode_outer_struct(value: &crate::data::OuterStruct, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> {
+ crate::data::transient_0::encode_inner_struct(&value.inner, writer)?;
+ crate::transient_0::encode_int_32(&value.c, writer)?;
+ ::std::io::Result::Ok(())
}
-pub fn decode_outer_struct(reader: &mut impl std::io::Read) -> crate::data::OuterStruct {
- let inner = crate::data::transient_0::decode_inner_struct(reader);
- let c = crate::transient_0::decode_int_32(reader);
- crate::data::OuterStruct { inner: inner, c: c }
+pub fn decode_outer_struct(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::OuterStruct> {
+ let inner = crate::data::transient_0::decode_inner_struct(reader)?;
+ let c = crate::transient_0::decode_int_32(reader)?;
+ std::io::Result::Ok(crate::data::OuterStruct { inner: inner, c: c })
}
-pub fn encode_inner_struct(value: &crate::data::InnerStruct, writer: &mut impl std::io::Write) {
- crate::transient_0::encode_int_32(&value.a, writer);
- crate::transient_0::encode_int_32(&value.b, writer);
+pub fn encode_inner_struct(value: &crate::data::InnerStruct, 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_inner_struct(reader: &mut impl std::io::Read) -> crate::data::InnerStruct {
- let a = crate::transient_0::decode_int_32(reader);
- let b = crate::transient_0::decode_int_32(reader);
- crate::data::InnerStruct { a: a, b: b }
+pub fn decode_inner_struct(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::InnerStruct> {
+ let a = crate::transient_0::decode_int_32(reader)?;
+ let b = crate::transient_0::decode_int_32(reader)?;
+ std::io::Result::Ok(crate::data::InnerStruct { a: a, b: b })
}
-pub fn encode_struct_with_list(value: &crate::data::StructWithList, writer: &mut impl std::io::Write) {
+pub fn encode_struct_with_list(value: &crate::data::StructWithList, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> {
todo!();
todo!();
+ ::std::io::Result::Ok(())
}
-pub fn decode_struct_with_list(reader: &mut impl std::io::Read) -> crate::data::StructWithList {
+pub fn decode_struct_with_list(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::StructWithList> {
let a = todo!();
let b = todo!();
- crate::data::StructWithList { a: a, b: b }
+ 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) {
+pub fn encode_struct_with_option(value: &crate::data::StructWithOption, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> {
todo!();
todo!();
+ ::std::io::Result::Ok(())
}
-pub fn decode_struct_with_option(reader: &mut impl std::io::Read) -> crate::data::StructWithOption {
+pub fn decode_struct_with_option(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::StructWithOption> {
let a = todo!();
let b = todo!();
- crate::data::StructWithOption { a: a, b: b }
+ std::io::Result::Ok(crate::data::StructWithOption { a: a, b: b })
}
-pub fn encode_variant_one(value: &crate::data::VariantOne, writer: &mut impl std::io::Write) {
- crate::transient_0::encode_int_32(&value.a, writer);
+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) -> crate::data::VariantOne {
- let a = crate::transient_0::decode_int_32(reader);
- crate::data::VariantOne { a: a }
+pub fn decode_variant_one(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::VariantOne> {
+ 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) {
- crate::transient_0::encode_int_64(&value.a, writer);
+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) -> crate::data::VariantTwo {
- let a = crate::transient_0::decode_int_64(reader);
- crate::data::VariantTwo { a: a }
+pub fn decode_variant_two(reader: &mut impl std::io::Read) -> ::std::io::Result::<crate::data::VariantTwo> {
+ let a = crate::transient_0::decode_int_64(reader)?;
+ std::io::Result::Ok(crate::data::VariantTwo { a: a })
}
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
index ad47d30..024ad03 100644
--- a/examples/10-transient-0/output/rust/src/gen/transient_0.rs
+++ b/examples/10-transient-0/output/rust/src/gen/transient_0.rs
@@ -1,43 +1,47 @@
// Generated by hobgoblin.
-pub fn encode_bool(value: &::core::primitive::bool, writer: &mut impl std::io::Write) {
+pub fn encode_bool(value: &::core::primitive::bool, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> {
todo!();
+ ::std::io::Result::Ok(())
}
-pub fn decode_bool(reader: &mut impl std::io::Read) -> ::core::primitive::bool {
- todo!()
+pub fn decode_bool(reader: &mut impl std::io::Read) -> ::std::io::Result::<::core::primitive::bool> {
+ std::io::Result::Ok(todo!())
}
-pub fn encode_int_32(value: &::core::primitive::i32, writer: &mut impl std::io::Write) {
- writer.write_all(&value.to_le_bytes());
+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) -> ::core::primitive::i32 {
+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);
+ reader.read_exact(&mut bytes)?;
bytes
};
- ::core::primitive::i32::from_le_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) {
- writer.write_all(&value.to_le_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) -> ::core::primitive::i64 {
+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);
+ reader.read_exact(&mut bytes)?;
bytes
};
- ::core::primitive::i64::from_le_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) {
+pub fn encode_string(value: &::std::string::String, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> {
todo!();
+ ::std::io::Result::Ok(())
}
-pub fn decode_string(reader: &mut impl std::io::Read) -> ::std::string::String {
- todo!()
+pub fn decode_string(reader: &mut impl std::io::Read) -> ::std::io::Result::<::std::string::String> {
+ std::io::Result::Ok(todo!())
}
diff --git a/examples/10-transient-0/output/rust/src/lib.rs b/examples/10-transient-0/output/rust/src/lib.rs
index 6468674..80fa64f 100644
--- a/examples/10-transient-0/output/rust/src/lib.rs
+++ b/examples/10-transient-0/output/rust/src/lib.rs
@@ -41,14 +41,14 @@ mod test {
fn assert_round_trip_encoding<T: std::cmp::PartialEq + std::fmt::Debug>(
value: T,
- encode: impl Fn(&T, &mut Cursor<Vec<u8>>),
- decode: impl Fn(&mut Cursor<Vec<u8>>) -> T,
+ encode: impl Fn(&T, &mut Cursor<Vec<u8>>) -> std::io::Result<()>,
+ decode: impl Fn(&mut Cursor<Vec<u8>>) -> std::io::Result<T>,
) {
let mut bytes = Cursor::new(Vec::new());
- encode(&value, &mut bytes);
+ encode(&value, &mut bytes).unwrap();
bytes.set_position(0);
- let decoded_value = decode(&mut bytes);
+ let decoded_value = decode(&mut bytes).unwrap();
assert_eq!(value, decoded_value);
}
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 8405232..8fc9b61 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
@@ -268,10 +268,18 @@ public class RustTransient0Generator implements Generator {
new RustFunctionParam(VALUE_NAME, new RustSharedReferenceType(rustType)),
new RustFunctionParam(WRITER_NAME, new RustMutableReferenceType(new RustImplTraitType(RustPath.of("std", "io", "Write"))))
),
- Optional.empty(),
+ Optional.of(
+ RustPath.global("std", "io", "Result")
+ .withArgs(List.of(new RustTupleType(List.of())))
+ ),
Optional.of(new RustBlockExpression(
body,
- Optional.empty()
+ Optional.of(
+ new RustCallExpression(
+ RustPath.global("std", "io", "Result", "Ok"),
+ List.of(new RustTupleExpression(List.of()))
+ )
+ )
))
);
}
@@ -288,8 +296,11 @@ public class RustTransient0Generator implements Generator {
List.of(
new RustFunctionParam(READER_NAME, new RustMutableReferenceType(new RustImplTraitType(RustPath.of("std", "io", "Read"))))
),
- Optional.of(rustType),
- Optional.of(body)
+ Optional.of(RustPath.global("std", "io", "Result").withArgs(List.of(rustType))),
+ Optional.of(new RustBlockExpression(
+ body.statements(),
+ body.finalOperand().map(finalOperand -> new RustCallExpression(RustPath.of("std", "io", "Result", "Ok"), List.of(finalOperand)))
+ ))
);
}
@@ -367,10 +378,10 @@ public class RustTransient0Generator implements Generator {
);
return List.of(
- new RustExpressionStatement(new RustCallExpression(
+ new RustExpressionStatement(new RustTryPropagationExpression(new RustCallExpression(
rustEncodeFunctionPath,
List.of(value, RustPath.of(WRITER_NAME))
- ))
+ )))
);
}
@@ -383,20 +394,20 @@ public class RustTransient0Generator implements Generator {
rustDecodeFunctionPathSegments
);
- return new RustCallExpression(
+ return new RustTryPropagationExpression(new RustCallExpression(
rustDecodeFunctionPath,
List.of(RustPath.of(READER_NAME))
- );
+ ));
}
private RustExpression generateWriterWrite(RustExpression valueToWrite) {
- return new RustCallExpression(
+ return new RustTryPropagationExpression(new RustCallExpression(
new RustFieldExpression(
RustPath.of(WRITER_NAME),
RustIdentifier.of("write_all")
),
List.of(valueToWrite)
- );
+ ));
}
private RustExpression generateReaderReadExact(int length) {
@@ -412,7 +423,7 @@ public class RustTransient0Generator implements Generator {
new RustIntegerLiteral(length)
)
),
- new RustExpressionStatement(new RustCallExpression(
+ new RustExpressionStatement(new RustTryPropagationExpression(new RustCallExpression(
new RustFieldExpression(
RustPath.of(READER_NAME),
RustIdentifier.of("read_exact")
@@ -423,7 +434,7 @@ public class RustTransient0Generator implements Generator {
RustPath.of(bytes)
)
)
- ))
+ )))
),
Optional.of(RustPath.of(bytes))
);