@@ -1999,18 +1999,21 @@ mod {mod_name} {{
1999
1999
r#"
2000
2000
}}
2001
2001
2002
- #[repr(transparent)]
2003
- pub struct Decoder<R>(::core::option::Option<PayloadDecoder<R>>)
2002
+ pub enum Decoder<R>
2004
2003
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
+ }}
2006
2009
2007
2010
#[automatically_derived]
2008
- impl<R> ::core::default::Default for Decoder<R>
2011
+ impl<R> ::core::default::Default for Decoder<R>
2009
2012
where
2010
2013
R: ::core::marker::Send + ::core::marker::Sync + {wrpc_transport}::Index<R> + {tokio}::io::AsyncRead + ::core::marker::Unpin + 'static,
2011
2014
{{
2012
2015
fn default() -> Self {{
2013
- Self(None)
2016
+ Self::Payload (None)
2014
2017
}}
2015
2018
}}
2016
2019
@@ -2020,7 +2023,8 @@ mod {mod_name} {{
2020
2023
R: ::core::marker::Send + ::core::marker::Sync + {wrpc_transport}::Index<R> + {tokio}::io::AsyncRead + ::core::marker::Unpin + 'static,
2021
2024
{{
2022
2025
fn take_deferred(&mut self) -> ::core::option::Option<{wrpc_transport}::DeferredFn<R>> {{
2023
- match self.0 {{"#
2026
+ match self {{
2027
+ Self::Payload(None) => None,"#
2024
2028
) ;
2025
2029
for Case {
2026
2030
name : case_name,
@@ -2030,19 +2034,21 @@ mod {mod_name} {{
2030
2034
{
2031
2035
let case = case_name. to_upper_camel_case ( ) ;
2032
2036
if ty. is_some ( ) {
2033
- uwriteln ! (
2037
+ uwrite ! (
2034
2038
self . src,
2035
2039
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(),"
2039
2041
) ;
2040
2042
}
2041
2043
}
2042
2044
uwriteln ! (
2043
2045
self . src,
2044
2046
r#"
2045
- None => None,
2047
+ Self::Deferred(f) => {{
2048
+ let f = f.take();
2049
+ *self = Self::Payload(None);
2050
+ f
2051
+ }},
2046
2052
}}
2047
2053
}}
2048
2054
}}
@@ -2056,7 +2062,7 @@ mod {mod_name} {{
2056
2062
type Error = ::std::io::Error;
2057
2063
2058
2064
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 {{
2060
2066
state
2061
2067
}} else {{
2062
2068
let Some(disc) = {wasm_tokio}::Leb128DecoderU32.decode(src)? else {{
@@ -2075,22 +2081,33 @@ mod {mod_name} {{
2075
2081
{
2076
2082
let case = case_name. to_upper_camel_case ( ) ;
2077
2083
if ty. is_some ( ) {
2078
- uwriteln ! (
2084
+ uwrite ! (
2079
2085
self . src,
2080
2086
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
+ }},"
2082
2094
) ;
2083
2095
} 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
+ ) ;
2085
2101
}
2086
2102
}
2087
2103
uwrite ! (
2088
2104
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}}`"))),
2090
2107
}}
2091
2108
}};
2092
2109
2093
- let decoded = match state {{"#
2110
+ match state {{"#
2094
2111
) ;
2095
2112
for Case {
2096
2113
name : case_name,
@@ -2107,19 +2124,16 @@ mod {mod_name} {{
2107
2124
let Some(payload) = dec.decode(src)? else {{
2108
2125
return Ok(None)
2109
2126
}};
2110
- Some(super::{name}::{case}(payload))
2127
+ *self = Self::Deferred({wrpc_transport}::Deferred::<R>::take_deferred(dec));
2128
+ Ok(Some(super::{name}::{case}(payload)))
2111
2129
}},"
2112
2130
) ;
2113
2131
}
2114
2132
}
2115
2133
uwriteln ! (
2116
2134
self . src,
2117
2135
r#"
2118
- }};
2119
-
2120
- let _ = self.0.take();
2121
-
2122
- Ok(decoded)
2136
+ }}
2123
2137
}}
2124
2138
}}
2125
2139
}}"# ,
0 commit comments