Skip to content

Commit 1a19079

Browse files
committed
feat(rs-bindgen): reset variant payload decoder state
Signed-off-by: Roman Volosatovs <[email protected]>
1 parent 99ff1dc commit 1a19079

File tree

1 file changed

+37
-23
lines changed

1 file changed

+37
-23
lines changed

crates/wit-bindgen-rust/src/interface.rs

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,18 +1999,21 @@ mod {mod_name} {{
19991999
r#"
20002000
}}
20012001
2002-
#[repr(transparent)]
2003-
pub struct Decoder<R>(::core::option::Option<PayloadDecoder<R>>)
2002+
pub enum Decoder<R>
20042003
where
2005-
R: ::core::marker::Send + ::core::marker::Sync + {wrpc_transport}::Index<R> + {tokio}::io::AsyncRead + ::core::marker::Unpin + 'static;
2004+
R: ::core::marker::Send + ::core::marker::Sync + {wrpc_transport}::Index<R> + {tokio}::io::AsyncRead + ::core::marker::Unpin + 'static,
2005+
{{
2006+
Payload(::core::option::Option<PayloadDecoder<R>>),
2007+
Deferred(::core::option::Option<{wrpc_transport}::DeferredFn<R>>)
2008+
}}
20062009
20072010
#[automatically_derived]
2008-
impl<R> ::core::default::Default for Decoder<R>
2011+
impl<R> ::core::default::Default for Decoder<R>
20092012
where
20102013
R: ::core::marker::Send + ::core::marker::Sync + {wrpc_transport}::Index<R> + {tokio}::io::AsyncRead + ::core::marker::Unpin + 'static,
20112014
{{
20122015
fn default() -> Self {{
2013-
Self(None)
2016+
Self::Payload(None)
20142017
}}
20152018
}}
20162019
@@ -2020,7 +2023,8 @@ mod {mod_name} {{
20202023
R: ::core::marker::Send + ::core::marker::Sync + {wrpc_transport}::Index<R> + {tokio}::io::AsyncRead + ::core::marker::Unpin + 'static,
20212024
{{
20222025
fn take_deferred(&mut self) -> ::core::option::Option<{wrpc_transport}::DeferredFn<R>> {{
2023-
match self.0 {{"#
2026+
match self {{
2027+
Self::Payload(None) => None,"#
20242028
);
20252029
for Case {
20262030
name: case_name,
@@ -2030,19 +2034,21 @@ mod {mod_name} {{
20302034
{
20312035
let case = case_name.to_upper_camel_case();
20322036
if ty.is_some() {
2033-
uwriteln!(
2037+
uwrite!(
20342038
self.src,
20352039
r"
2036-
Some(PayloadDecoder::{case}(ref mut dec)) => {{
2037-
dec.take_deferred()
2038-
}},"
2040+
Self::Payload(Some(PayloadDecoder::{case}(ref mut dec))) => dec.take_deferred(),"
20392041
);
20402042
}
20412043
}
20422044
uwriteln!(
20432045
self.src,
20442046
r#"
2045-
None => None,
2047+
Self::Deferred(f) => {{
2048+
let f = f.take();
2049+
*self = Self::Payload(None);
2050+
f
2051+
}},
20462052
}}
20472053
}}
20482054
}}
@@ -2056,7 +2062,7 @@ mod {mod_name} {{
20562062
type Error = ::std::io::Error;
20572063
20582064
fn decode(&mut self, src: &mut {bytes}::BytesMut) -> ::core::result::Result<::core::option::Option<Self::Item>, Self::Error> {{
2059-
let state = if let Some(ref mut state) = self.0 {{
2065+
let state = if let Self::Payload(Some(ref mut state)) = self {{
20602066
state
20612067
}} else {{
20622068
let Some(disc) = {wasm_tokio}::Leb128DecoderU32.decode(src)? else {{
@@ -2075,22 +2081,33 @@ mod {mod_name} {{
20752081
{
20762082
let case = case_name.to_upper_camel_case();
20772083
if ty.is_some() {
2078-
uwriteln!(
2084+
uwrite!(
20792085
self.src,
20802086
r"
2081-
{i} => self.0.insert(PayloadDecoder::{case}(::core::default::Default::default())),"
2087+
{i} => {{
2088+
*self = Self::Payload(::core::option::Option::default());
2089+
let Self::Payload(ref mut dec) = self else {{
2090+
unreachable!()
2091+
}};
2092+
dec.insert(PayloadDecoder::{case}(::core::default::Default::default()))
2093+
}},"
20822094
);
20832095
} else {
2084-
uwriteln!(self.src, "{i} => return Ok(Some(super::{name}::{case})),");
2096+
uwrite!(
2097+
self.src,
2098+
"
2099+
{i} => return Ok(Some(super::{name}::{case})),"
2100+
);
20852101
}
20862102
}
20872103
uwrite!(
20882104
self.src,
2089-
r#"_ => return Err(::std::io::Error::new(::std::io::ErrorKind::InvalidInput, format!("unknown variant discriminant `{{disc}}`"))),
2105+
r#"
2106+
_ => return Err(::std::io::Error::new(::std::io::ErrorKind::InvalidInput, format!("unknown variant discriminant `{{disc}}`"))),
20902107
}}
20912108
}};
20922109
2093-
let decoded = match state {{"#
2110+
match state {{"#
20942111
);
20952112
for Case {
20962113
name: case_name,
@@ -2107,19 +2124,16 @@ mod {mod_name} {{
21072124
let Some(payload) = dec.decode(src)? else {{
21082125
return Ok(None)
21092126
}};
2110-
Some(super::{name}::{case}(payload))
2127+
*self = Self::Deferred({wrpc_transport}::Deferred::<R>::take_deferred(dec));
2128+
Ok(Some(super::{name}::{case}(payload)))
21112129
}},"
21122130
);
21132131
}
21142132
}
21152133
uwriteln!(
21162134
self.src,
21172135
r#"
2118-
}};
2119-
2120-
let _ = self.0.take();
2121-
2122-
Ok(decoded)
2136+
}}
21232137
}}
21242138
}}
21252139
}}"#,

0 commit comments

Comments
 (0)