@@ -111,10 +111,14 @@ void MessageMutClear(Context& ctx, const Descriptor& msg) {
111111 }
112112}
113113
114- void MessageMutClearAndParse (Context& ctx, const Descriptor& msg) {
114+ void MessageMutClearAndParse (Context& ctx, const Descriptor& msg,
115+ bool enforce_required) {
115116 switch (ctx.opts ().kernel ) {
116- case Kernel::kCpp :
117- ctx.Emit ({},
117+ case Kernel::kCpp : {
118+ absl::string_view parse_function =
119+ enforce_required ? " proto2_rust_Message_parse"
120+ : " proto2_rust_Message_parse_dont_enforce_required" ;
121+ ctx.Emit ({{" parse_function" , parse_function}},
118122 R"rs(
119123 let success = unsafe {
120124 // SAFETY: `data.as_ptr()` is valid to read for `data.len()`.
@@ -123,34 +127,41 @@ void MessageMutClearAndParse(Context& ctx, const Descriptor& msg) {
123127 data.len(),
124128 );
125129
126- $pbr$::proto2_rust_Message_parse (self.raw_msg(), data)
130+ $pbr$::$parse_function$ (self.raw_msg(), data)
127131 };
128132 success.then_some(()).ok_or($pb$::ParseError)
129133 )rs" );
130134 return ;
131-
132- case Kernel::kUpb :
133- ctx.Emit (
134- R"rs(
135+ }
136+
137+ case Kernel::kUpb : {
138+ absl::string_view decode_options =
139+ enforce_required ? " $pbr$::wire::decode_options::CHECK_REQUIRED"
140+ : " 0" ;
141+ ctx.Emit ({{" decode_options" ,
142+ [&ctx, decode_options] { ctx.Emit (decode_options); }}},
143+ R"rs(
135144 $pb$::Clear::clear(self);
136145
137146 // SAFETY:
138147 // - `data.as_ptr()` is valid to read for `data.len()`
139148 // - `mini_table` is the one used to construct `msg.raw_msg()`
140149 // - `msg.arena().raw()` is held for the same lifetime as `msg`.
141150 let status = unsafe {
142- $pbr$::wire::decode (
151+ $pbr$::wire::decode_with_options (
143152 data,
144153 self.raw_msg(),
145154 <Self as $pbr$::AssociatedMiniTable>::mini_table(),
146- self.arena())
155+ self.arena(),
156+ $decode_options$)
147157 };
148158 match status {
149159 Ok(_) => Ok(()),
150160 Err(_) => Err($pb$::ParseError),
151161 }
152162 )rs" );
153163 return ;
164+ }
154165 }
155166
156167 ABSL_LOG (FATAL) << " unreachable" ;
@@ -700,7 +711,13 @@ void GenerateRs(Context& ctx, const Descriptor& msg) {
700711 {" Msg::serialize" , [&] { MessageSerialize (ctx, msg); }},
701712 {" MsgMut::clear" , [&] { MessageMutClear (ctx, msg); }},
702713 {" MsgMut::clear_and_parse" ,
703- [&] { MessageMutClearAndParse (ctx, msg); }},
714+ [&] {
715+ MessageMutClearAndParse (ctx, msg, /* enforce_required=*/ true );
716+ }},
717+ {" MsgMut::clear_and_parse_dont_enforce_required" ,
718+ [&] {
719+ MessageMutClearAndParse (ctx, msg, /* enforce_required=*/ false );
720+ }},
704721 {" Msg::drop" , [&] { MessageDrop (ctx, msg); }},
705722 {" Msg::debug" , [&] { MessageDebug (ctx, msg); }},
706723 {" MsgMut::take_copy_merge_from" ,
@@ -830,6 +847,10 @@ void GenerateRs(Context& ctx, const Descriptor& msg) {
830847 fn parse(serialized: &[u8]) -> $Result$<Self, $pb$::ParseError> {
831848 Self::parse(serialized)
832849 }
850+
851+ fn parse_dont_enforce_required(serialized: &[u8]) -> $Result$<Self, $pb$::ParseError> {
852+ Self::parse_dont_enforce_required(serialized)
853+ }
833854 }
834855
835856 impl $std$::fmt::Debug for $Msg$ {
@@ -877,6 +898,11 @@ void GenerateRs(Context& ctx, const Descriptor& msg) {
877898 let mut m = self.as_mut();
878899 $pb$::ClearAndParse::clear_and_parse(&mut m, data)
879900 }
901+
902+ fn clear_and_parse_dont_enforce_required(&mut self, data: &[u8]) -> $Result$<(), $pb$::ParseError> {
903+ let mut m = self.as_mut();
904+ $pb$::ClearAndParse::clear_and_parse_dont_enforce_required(&mut m, data)
905+ }
880906 }
881907
882908 // SAFETY:
@@ -1014,6 +1040,10 @@ void GenerateRs(Context& ctx, const Descriptor& msg) {
10141040 fn clear_and_parse(&mut self, data: &[u8]) -> $Result$<(), $pb$::ParseError> {
10151041 $MsgMut::clear_and_parse$
10161042 }
1043+
1044+ fn clear_and_parse_dont_enforce_required(&mut self, data: &[u8]) -> $Result$<(), $pb$::ParseError> {
1045+ $MsgMut::clear_and_parse_dont_enforce_required$
1046+ }
10171047 }
10181048
10191049 $MsgMut::take_copy_merge_from$
@@ -1116,6 +1146,11 @@ void GenerateRs(Context& ctx, const Descriptor& msg) {
11161146 $pb$::ClearAndParse::clear_and_parse(&mut msg, data).map(|_| msg)
11171147 }
11181148
1149+ pub fn parse_dont_enforce_required(data: &[u8]) -> $Result$<Self, $pb$::ParseError> {
1150+ let mut msg = Self::new();
1151+ $pb$::ClearAndParse::clear_and_parse_dont_enforce_required(&mut msg, data).map(|_| msg)
1152+ }
1153+
11191154 pub fn as_view(&self) -> $Msg$View {
11201155 $Msg$View::new($pbi$::Private, self.inner.msg)
11211156 }
0 commit comments