From e9919a0d465b3939bbb5276bcd7987db6c0785a9 Mon Sep 17 00:00:00 2001 From: Tomasz Pietrek Date: Mon, 5 Aug 2024 11:53:09 +0200 Subject: [PATCH] Fix serde Stream roundtrip If someone does a serde serialize/deserialize roundtrip with jetstream::stream::Stream, it will result in error, as then `ConsumerLimits` will be `null`. This should not happen in real-world scenarios, as server does not send nulls for those values, however its good to protect against those scenarios in case Go/nats-server changes its behaviour as some point in time. Signed-off-by: Tomasz Pietrek --- async-nats/src/jetstream/stream.rs | 31 +++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/async-nats/src/jetstream/stream.rs b/async-nats/src/jetstream/stream.rs index cc900b1bc..bf9818f7b 100755 --- a/async-nats/src/jetstream/stream.rs +++ b/async-nats/src/jetstream/stream.rs @@ -1120,14 +1120,17 @@ fn default_consumer_limits_as_none<'de, D>( where D: Deserializer<'de>, { - let consumer_limits = ConsumerLimits::deserialize(deserializer)?; - if consumer_limits == ConsumerLimits::default() { - Ok(None) + let consumer_limits = Option::::deserialize(deserializer)?; + if let Some(cl) = consumer_limits { + if cl == ConsumerLimits::default() { + Ok(None) + } else { + Ok(Some(cl)) + } } else { - Ok(Some(consumer_limits)) + Ok(None) } } - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct ConsumerLimits { /// Sets the maximum [crate::jetstream::consumer::Config::inactive_threshold] that can be set on the consumer. @@ -2062,3 +2065,21 @@ impl From for ConsumerCreateStrictError { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn consumer_limits_de() { + let config = Config { + ..Default::default() + }; + + let roundtrip: Config = { + let ser = serde_json::to_string(&config).unwrap(); + serde_json::from_str(&ser).unwrap() + }; + assert_eq!(config, roundtrip); + } +}