diff options
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)) ); |
