[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';