sheave_core/messages/
set_data_frame.rs

1use std::io::Result as IOResult;
2use crate::{
3    ByteBuffer,
4    Decoder,
5    Encoder
6};
7use super::{
8    Channel,
9    ChunkData,
10    headers::MessageType
11};
12
13/// The message to handle something data.
14#[derive(Debug, Clone, Default, PartialEq, Eq)]
15pub struct SetDataFrame(Vec<u8>);
16
17impl SetDataFrame {
18    /// Constructs a new SetDataFrame message.
19    pub fn new(bytes: Vec<u8>) -> Self {
20        Self(bytes)
21    }
22}
23
24impl From<SetDataFrame> for Vec<u8> {
25    fn from(set_data_frame: SetDataFrame) -> Self {
26        set_data_frame.0
27    }
28}
29
30impl ChunkData for SetDataFrame {
31    const CHANNEL: Channel = Channel::Audio;
32    const MESSAGE_TYPE: MessageType = MessageType::Data;
33}
34
35impl Decoder<SetDataFrame> for ByteBuffer {
36    /// Decodes bytes into a SetDataFrame message.
37    ///
38    /// # Errors
39    ///
40    /// * [`InsufficientBufferLength`]
41    ///
42    /// When some field misses.
43    ///
44    /// * [`InconsistentMarker`]
45    ///
46    /// When some value is inconsistent with its marker.
47    ///
48    /// * [`InvalidString`]
49    ///
50    /// When some value is invalid for UTF-8 string.
51    ///
52    /// * [`InconsistentCommand`]
53    ///
54    /// When the command name isn't `"@setDataFrame"`.
55    ///
56    /// # Examples
57    ///
58    /// ```rust
59    /// use rand::{
60    ///     Fill,
61    ///     thread_rng
62    /// };
63    /// use sheave_core::{
64    ///     ByteBuffer,
65    ///     Decoder,
66    ///     Encoder,
67    ///     messages::SetDataFrame
68    /// };
69    ///
70    /// let mut buffer = ByteBuffer::default();
71    /// let mut bytes: [u8; 128] = [0; 128];
72    /// bytes.try_fill(&mut thread_rng()).unwrap();
73    /// buffer.put_bytes(&bytes);
74    /// assert!(Decoder::<SetDataFrame>::decode(&mut buffer).is_ok());
75    /// ```
76    ///
77    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
78    /// [`InconsistentMarker`]: crate::messages::amf::InconsistentMarker
79    /// [`InvalidString`]: crate::messages::amf::InvalidString
80    /// [`InconsistentCommand`]: super::InconsistentCommand
81    fn decode(&mut self) -> IOResult<SetDataFrame> {
82        let remained = self.remained();
83        let bytes = self.get_bytes(remained)?.to_vec();
84        Ok(SetDataFrame(bytes))
85    }
86}
87
88impl Encoder<SetDataFrame> for ByteBuffer {
89    /// Encodes a SetDataFrame message into bytes.
90    fn encode(&mut self, set_data_frame: &SetDataFrame) {
91        self.put_bytes(&set_data_frame.0);
92    }
93}
94
95#[cfg(test)]
96mod tests {
97    use rand::{
98        Fill,
99        thread_rng
100    };
101    use super::*;
102
103    #[test]
104    fn decode_set_data_frame() {
105        let mut buffer = ByteBuffer::default();
106        let mut bytes: [u8; 128] = [0; 128];
107        bytes.try_fill(&mut thread_rng()).unwrap();
108        buffer.put_bytes(&bytes);
109        let result: IOResult<SetDataFrame> = buffer.decode();
110        assert!(result.is_ok());
111        let actual = result.unwrap();
112        let expected = SetDataFrame::new(bytes.to_vec());
113        assert_eq!(expected, actual)
114    }
115
116    #[test]
117    fn encode_set_data_frame() {
118        let mut buffer = ByteBuffer::default();
119        let mut expected_bytes: [u8; 128] = [0; 128];
120        expected_bytes.try_fill(&mut thread_rng()).unwrap();
121        let expected = SetDataFrame::new(expected_bytes.to_vec());
122        buffer.encode(&expected);
123        let actual_data: Vec<u8> = buffer.into();
124        assert_eq!(expected_bytes.as_slice(), &actual_data)
125    }
126}