[rust] Gracefully handle error upon receiving incompatible enum (#3181)
Improve the code generator so that Rust code, when receiving an union with an invalid field ID, can gracefully return an error.
diff --git a/compiler/cpp/src/thrift/generate/t_rs_generator.cc b/compiler/cpp/src/thrift/generate/t_rs_generator.cc
index e336077..7677bdf 100644
--- a/compiler/cpp/src/thrift/generate/t_rs_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_rs_generator.cc
@@ -1840,9 +1840,19 @@
render_thrift_error("Protocol", "ProtocolError", "ProtocolErrorKind::InvalidData",
"\"received multiple fields for union from remote " + union_name + "\"");
indent_down();
+ f_gen_ << indent() << "} else if let Some(ret) = ret {" << '\n';
+ indent_up();
+ f_gen_ << indent() << "Ok(ret)" << '\n';
+ indent_down();
f_gen_ << indent() << "} else {" << '\n';
indent_up();
- f_gen_ << indent() << "Ok(ret.expect(\"return value should have been constructed\"))" << '\n';
+ f_gen_ << indent() << "Err(" << '\n';
+ indent_up();
+ f_gen_ << indent() << "thrift::Error::Protocol(" << '\n';
+ f_gen_ << indent() << " ProtocolError::new(ProtocolErrorKind::InvalidData, \"return value should have been constructed\")" << '\n';
+ f_gen_ << indent() << ")" << '\n';
+ indent_down();
+ f_gen_ << indent() << ")" << '\n';
indent_down();
f_gen_ << indent() << "}" << '\n';