sheave_core/messages/amf/v0/
null.rs

1use std::io::Result as IOResult;
2use super::{
3    Marker,
4    super::ensure_marker
5};
6use crate::{
7    Decoder,
8    Encoder,
9    ByteBuffer
10};
11
12/// The value to mean that has no content.
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14pub struct Null;
15
16impl Decoder<Null> for ByteBuffer {
17    /// Decodes bytes into an AMF's Null.
18    ///
19    /// # Errors
20    ///
21    /// * [`InsufficientBufferLength`]
22    ///
23    /// When buffer isn't remained at least 1 byte.
24    ///
25    /// * [`InconsistentMarker`]
26    ///
27    /// When a marker byte doesn't indicate the AMF Null.
28    ///
29    /// # Examples
30    ///
31    /// ```rust
32    /// use sheave_core::{
33    ///     ByteBuffer,
34    ///     Decoder,
35    ///     messages::amf::v0::{
36    ///         Marker,
37    ///         Null
38    ///     }
39    /// };
40    ///
41    /// let mut buffer = ByteBuffer::default();
42    /// buffer.put_u8(Marker::Null as u8);
43    /// assert!(Decoder::<Null>::decode(&mut buffer).is_ok());
44    ///
45    /// let mut buffer = ByteBuffer::default();
46    /// buffer.put_u8(Marker::Boolean as u8);
47    /// assert!(Decoder::<Null>::decode(&mut buffer).is_err());
48    ///
49    /// let mut buffer = ByteBuffer::default();
50    /// assert!(Decoder::<Null>::decode(&mut buffer).is_err())
51    /// ```
52    ///
53    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
54    /// [`InconsistentMarker`]: crate::messages::amf::InconsistentMarker
55    fn decode(&mut self) -> IOResult<Null> {
56        self.get_u8().and_then(
57            |marker| ensure_marker(Marker::Null as u8, marker)
58        )?;
59
60        Ok(Null)
61    }
62}
63
64impl Encoder<Null> for ByteBuffer {
65    /// Encodes an AMF's Null into bytes.
66    fn encode(&mut self, _: &Null) {
67        self.put_u8(Marker::Null as u8);
68    }
69}
70
71#[cfg(test)]
72mod tests {
73    use super::*;
74
75    #[test]
76    fn decode_null() {
77        let mut buffer = ByteBuffer::default();
78        buffer.put_u8(Marker::Null as u8);
79        assert!(Decoder::<Null>::decode(&mut buffer).is_ok())
80    }
81
82    #[test]
83    fn encode_null() {
84        let mut buffer = ByteBuffer::default();
85        buffer.encode(&Null);
86        let result: Vec<u8> = buffer.into();
87        assert_eq!(Marker::Null as u8, result[0])
88    }
89}