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}