cloudevents/message/
deserializer.rs

1use super::{BinarySerializer, Encoding, Error, Result, StructuredSerializer};
2use crate::event::{EventBinarySerializer, EventStructuredSerializer};
3use crate::Event;
4
5/// Deserializer trait for a Message that can be encoded as structured mode.
6pub trait StructuredDeserializer
7where
8    Self: Sized,
9{
10    /// Deserialize the message to [`StructuredSerializer`].
11    fn deserialize_structured<R: Sized, V: StructuredSerializer<R>>(
12        self,
13        serializer: V,
14    ) -> Result<R>;
15
16    /// Convert this Message to [`Event`].
17    fn into_event(self) -> Result<Event> {
18        self.deserialize_structured(EventStructuredSerializer {})
19    }
20}
21
22/// Deserializer trait for a Message that can be encoded as binary mode.
23pub trait BinaryDeserializer
24where
25    Self: Sized,
26{
27    /// Deserialize the message to [`BinarySerializer`].
28    fn deserialize_binary<R: Sized, V: BinarySerializer<R>>(self, serializer: V) -> Result<R>;
29
30    /// Convert this Message to [`Event`].
31    fn into_event(self) -> Result<Event> {
32        self.deserialize_binary(EventBinarySerializer::new())
33    }
34}
35
36/// Deserializer trait for a Message that can be encoded both in structured mode or binary mode.
37pub trait MessageDeserializer
38where
39    Self: StructuredDeserializer + BinaryDeserializer + Sized,
40{
41    /// Get this message [`Encoding`].
42    fn encoding(&self) -> Encoding;
43
44    /// Convert this Message to [`Event`].
45    fn into_event(self) -> Result<Event> {
46        match self.encoding() {
47            Encoding::BINARY => BinaryDeserializer::into_event(self),
48            Encoding::STRUCTURED => StructuredDeserializer::into_event(self),
49            _ => Err(Error::WrongEncoding {}),
50        }
51    }
52
53    /// Deserialize the message to [`BinarySerializer`].
54    fn deserialize_to_binary<R: Sized, T: BinarySerializer<R>>(self, serializer: T) -> Result<R> {
55        if self.encoding() == Encoding::BINARY {
56            return self.deserialize_binary(serializer);
57        }
58
59        MessageDeserializer::into_event(self)?.deserialize_binary(serializer)
60    }
61
62    /// Deserialize the message to [`StructuredSerializer`].
63    fn deserialize_to_structured<R: Sized, T: StructuredSerializer<R>>(
64        self,
65        serializer: T,
66    ) -> Result<R> {
67        if self.encoding() == Encoding::STRUCTURED {
68            return self.deserialize_structured(serializer);
69        }
70
71        MessageDeserializer::into_event(self)?.deserialize_structured(serializer)
72    }
73
74    /// Deserialize the message to a serializer, depending on the message encoding.
75    /// You can use this method to transcode this message directly to another serializer, without going through [`Event`].
76    fn deserialize_to<R: Sized, T: BinarySerializer<R> + StructuredSerializer<R>>(
77        self,
78        serializer: T,
79    ) -> Result<R> {
80        if self.encoding() == Encoding::STRUCTURED {
81            self.deserialize_structured(serializer)
82        } else {
83            self.deserialize_binary(serializer)
84        }
85    }
86}