sheave_core/messages/
set_buffer_length.rs

1use std::io::Result as IOResult;
2use crate::{
3    ByteBuffer,
4    Decoder,
5    Encoder,
6    messages::{
7        Channel,
8        ChunkData,
9        EventType,
10        UserControl,
11        headers::MessageType,
12    }
13};
14
15/// The event to tell that its stream will be buffered, to the server.
16///
17/// Following format is required:
18///
19/// |Event Data|Length (in bytes)|Description|
20/// | :- | -: | :- |
21/// |Message ID|4|The message ID which is same as contained in [`createStream`].|
22/// |Buffer Length|4|**A time length** to charge a data into a stream (in milliseconds).|
23///
24/// [`createStream`]: crate::messages::CreateStream
25#[derive(Debug, Clone, Copy, PartialEq, Eq)]
26pub struct SetBufferLength(u32, u32);
27
28impl SetBufferLength {
29    /// Constructs a SetBufferLength event.
30    pub fn new(message_id: u32, buffering_time: u32) -> Self {
31        Self(message_id, buffering_time)
32    }
33
34    /// Gets the message ID which this event has.
35    pub fn get_message_id(&self) -> u32 {
36        self.0
37    }
38
39    /// Gets the buffering time which this event has.
40    pub fn get_buffering_time(&self) -> u32 {
41        self.1
42    }
43}
44
45impl From<SetBufferLength> for (u32, u32) {
46    fn from(set_buffer_length: SetBufferLength) -> Self {
47        (set_buffer_length.0, set_buffer_length.1)
48    }
49}
50
51impl ChunkData for SetBufferLength {
52    const CHANNEL: Channel = Channel::Network;
53    const MESSAGE_TYPE: MessageType = MessageType::UserControl;
54}
55
56impl UserControl for SetBufferLength {
57    const EVENT_TYPE: EventType = EventType::SetBufferLength;
58}
59
60impl Decoder<SetBufferLength> for ByteBuffer {
61    /// Decodes bytes into a SetBufferLength event.
62    ///
63    /// # Errors
64    ///
65    /// * [`InsufficientBufferLength`]
66    ///
67    /// When some field misses.
68    ///
69    /// # Examples
70    ///
71    /// ```rust
72    /// use sheave_core::{
73    ///     ByteBuffer,
74    ///     Decoder,
75    ///     Encoder,
76    ///     messages::{
77    ///         EventType,
78    ///         SetBufferLength
79    ///     }
80    /// };
81    ///
82    /// let mut buffer = ByteBuffer::default();
83    /// buffer.put_u32_be(u32::default());
84    /// buffer.put_u32_be(u32::default());
85    /// assert!(Decoder::<SetBufferLength>::decode(&mut buffer).is_ok());
86    ///
87    /// let mut buffer = ByteBuffer::default();
88    /// assert!(Decoder::<SetBufferLength>::decode(&mut buffer).is_err())
89    /// ```
90    ///
91    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
92    fn decode(&mut self) -> IOResult<SetBufferLength> {
93        let message_id = self.get_u32_be()?;
94        let buffering_time = self.get_u32_be()?;
95        Ok(SetBufferLength(message_id, buffering_time))
96    }
97}
98
99impl Encoder<SetBufferLength> for ByteBuffer {
100    /// Encodes a SetBufferLength event into bytes.
101    fn encode(&mut self, set_buffer_length: &SetBufferLength) {
102        self.put_u32_be(set_buffer_length.get_message_id());
103        self.put_u32_be(set_buffer_length.get_buffering_time());
104    }
105}
106
107#[cfg(test)]
108mod tests {
109    use super::*;
110
111    #[test]
112    fn decode_set_buffer_length() {
113        let mut buffer = ByteBuffer::default();
114        buffer.put_u32_be(u32::default());
115        buffer.put_u32_be(u32::default());
116        let result: IOResult<SetBufferLength> = buffer.decode();
117        assert!(result.is_ok());
118        let actual = result.unwrap();
119        let expected = SetBufferLength::new(u32::default(), u32::default());
120        assert_eq!(expected, actual)
121    }
122
123    #[test]
124    fn encode_set_buffer_length() {
125        let mut buffer = ByteBuffer::default();
126        let expected_message_id = u32::default();
127        let expected_buffering_time = u32::default();
128        let expected = SetBufferLength::new(expected_message_id, expected_buffering_time);
129        buffer.encode(&expected);
130        let actual_message_id = buffer.get_u32_be().unwrap();
131        assert_eq!(expected_message_id, actual_message_id);
132        let actual_buffering_time = buffer.get_u32_be().unwrap();
133        assert_eq!(expected_buffering_time, actual_buffering_time)
134    }
135}