cloudevents/binding/nats/
deserializer.rs

1use crate::{
2    message::{Result, StructuredDeserializer},
3    Event,
4};
5
6use nats_lib as nats;
7
8impl StructuredDeserializer for nats::Message {
9    fn deserialize_structured<R: Sized, V: crate::message::StructuredSerializer<R>>(
10        self,
11        serializer: V,
12    ) -> crate::message::Result<R> {
13        serializer.set_structured_event(self.data.to_vec())
14    }
15}
16
17/// Trait implemented by [`nats::Message`] to enable convenient deserialization to [`Event`]
18///
19/// Trait sealed <https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed>
20pub trait MessageExt: private::Sealed {
21    fn to_event(&self) -> Result<Event>;
22}
23
24impl MessageExt for nats::Message {
25    fn to_event(&self) -> Result<Event> {
26        StructuredDeserializer::into_event(self.to_owned())
27    }
28}
29
30mod private {
31    use nats_lib as nats;
32
33    // Sealing the MessageExt
34    pub trait Sealed {}
35    impl Sealed for nats::Message {}
36}
37
38#[cfg(test)]
39mod tests {
40    use crate::test::fixtures;
41    use nats_lib as nats;
42    use serde_json::json;
43
44    use super::*;
45
46    #[test]
47    fn test_structured_deserialize_v10() {
48        let expected = fixtures::v10::full_json_data_string_extension();
49
50        let nats_message = nats::Message::new(
51            "not_relevant",
52            None,
53            json!(expected).to_string().as_bytes(),
54            None,
55        );
56
57        let actual = nats_message.to_event().unwrap();
58
59        assert_eq!(expected, actual)
60    }
61
62    #[test]
63    fn test_structured_deserialize_v03() {
64        let expected = fixtures::v03::full_json_data();
65
66        let nats_message = nats::Message::new(
67            "not_relevant",
68            None,
69            json!(expected).to_string().as_bytes(),
70            None,
71        );
72
73        let actual = nats_message.to_event().unwrap();
74
75        assert_eq!(expected, actual)
76    }
77}