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.payload.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 {
51            subject: "not_relevant".into(),
52            payload: json!(expected).to_string().into_bytes().into(),
53            reply: None,
54            headers: None,
55            status: None,
56            description: None,
57            length: 0,
58        };
59
60        let actual = nats_message.to_event().unwrap();
61
62        assert_eq!(expected, actual)
63    }
64
65    #[test]
66    fn test_structured_deserialize_v03() {
67        let expected = fixtures::v03::full_json_data();
68
69        let nats_message = nats::Message {
70            subject: "not_relevant".into(),
71            payload: json!(expected).to_string().into_bytes().into(),
72            reply: None,
73            headers: None,
74            status: None,
75            description: None,
76            length: 0,
77        };
78
79        let actual = nats_message.to_event().unwrap();
80
81        assert_eq!(expected, actual)
82    }
83}