From 399aef569ddedcb58dcb394b394d55f20c78ee83 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 2 Aug 2026 13:23:34 +0100 Subject: Don't panic on unrecognised sum variant tag --- .../output/rust/src/gen/data/transient_0.rs | 4 +-- .../rusttransient0/RustTransient0Generator.java | 32 ++++++++++++---------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs index 3f81215..f802163 100644 --- a/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs +++ b/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs @@ -206,7 +206,7 @@ pub fn decode_sum_with_variants(reader: &mut impl std::io::Read, shared_values: ::std::io::Result::Ok(match &crate::transient_0::decode_int_32(reader, shared_values)? { 0 => crate::data::SumWithVariants::VariantOne(crate::data::transient_0::decode_variant_one(reader, shared_values)?), 1 => crate::data::SumWithVariants::VariantTwo(crate::data::transient_0::decode_variant_two(reader, shared_values)?), - _ => todo!(), + _ => ::std::result::Result::Err(::std::io::Error::new(::std::io::ErrorKind::InvalidData, "unrecognised variant tag for data.SumWithVariants"))?, }) } @@ -248,7 +248,7 @@ pub fn decode_sum_with_boxed_variants(reader: &mut impl std::io::Read, shared_va ::std::io::Result::Ok(match &crate::transient_0::decode_int_32(reader, shared_values)? { 0 => crate::data::SumWithBoxedVariants::VariantOne(::std::boxed::Box::new(crate::data::transient_0::decode_variant_one(reader, shared_values)?)), 1 => crate::data::SumWithBoxedVariants::VariantTwo(::std::boxed::Box::new(crate::data::transient_0::decode_variant_two(reader, shared_values)?)), - _ => todo!(), + _ => ::std::result::Result::Err(::std::io::Error::new(::std::io::ErrorKind::InvalidData, "unrecognised variant tag for data.SumWithBoxedVariants"))?, }) } 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 fed710f..b70752e 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 @@ -379,19 +379,7 @@ public class RustTransient0Generator implements Generator { decodeMatchArms.add(new RustMatchArm( new RustWildcardPattern(), - new RustTryPropagationExpression(new RustCallExpression( - RustTypes.RESULT_ERR, - List.of( - new RustCallExpression( - RustTypes.IO_ERROR.addSegment(RustPathSegment.of("new")), - List.of( - RustTypes.IO_ERROR_KIND_INVALID_DATA, - // TODO: include variant tag - new RustStringLiteral("unrecognised variant tag for " + enumDefinition.type().describe()) - ) - ) - ) - )) + new RustTryPropagationExpression(generateUnrecognisedVariantResult(enumDefinition.type())) )); return generateDecodeFunction( @@ -512,7 +500,7 @@ public class RustTransient0Generator implements Generator { decodeMatchArms.add(new RustMatchArm( new RustWildcardPattern(), - generateTodo() + new RustTryPropagationExpression(generateUnrecognisedVariantResult(sumDefinition.type())) )); return generateDecodeFunction( @@ -1104,6 +1092,22 @@ public class RustTransient0Generator implements Generator { ); } + private static RustCallExpression generateUnrecognisedVariantResult(Type type) { + return new RustCallExpression( + RustTypes.RESULT_ERR, + List.of( + new RustCallExpression( + RustTypes.IO_ERROR.addSegment(RustPathSegment.of("new")), + List.of( + RustTypes.IO_ERROR_KIND_INVALID_DATA, + // TODO: include variant tag + new RustStringLiteral("unrecognised variant tag for " + type.describe()) + ) + ) + ) + ); + } + private RustExpression tryIntoOrInvalidData(RustExpression value) { return new RustTryPropagationExpression(mapErrToInvalidData( methodCall( -- cgit v1.2.3