sheave_core/messages/
window_acknowledgement_size.rs

1use std::{
2    cmp::Ordering,
3    io::Result as IOResult,
4    ops::Div
5};
6use crate::{
7    ByteBuffer,
8    Decoder,
9    Encoder,
10    messages::{
11        Channel,
12        ChunkData,
13        headers::MessageType
14    }
15};
16
17/// The message to tell the bandwidth limit as a receiver side.
18///
19/// Following format is required.
20///
21/// |Field|Length (in bytes)|Description|
22/// | :- | -: | :- |
23/// |Bandwidth|4|The bandwidth number of a receiver side.|
24///
25/// When some amount of receiving data got exceeded this bandwidth, a receiver must send about it to a sender, by the [`Acknowledgement`] message.
26///
27/// Almost RTMP tools are specifying it 2500000 in bits as their defaults.
28///
29/// [`Acknowledgement`]: crate::messages::Acknowledgement
30#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
31pub struct WindowAcknowledgementSize(u32);
32
33impl WindowAcknowledgementSize {
34    const DEFAULT: u32 = 2500000;
35
36    /// Constructs an WindowAcknowledgementSize message.
37    pub fn new(window_acknowledgement_size: u32) -> Self {
38        Self(window_acknowledgement_size)
39    }
40
41    /// Gets an inner value.
42    pub fn get_inner(&self) -> u32 {
43        self.0
44    }
45}
46
47impl Default for WindowAcknowledgementSize {
48    /// Constructs an WindowAcknowledgementSize message with the default bandwidth (2500000 in bits).
49    ///
50    /// # Examples
51    ///
52    /// ```rust
53    /// use sheave_core::messages::WindowAcknowledgementSize;
54    ///
55    /// assert_eq!(2500000u32, WindowAcknowledgementSize::default())
56    /// ```
57    fn default() -> Self {
58        Self(Self::DEFAULT)
59    }
60}
61
62impl PartialEq<u32> for WindowAcknowledgementSize {
63    fn eq(&self, other: &u32) -> bool {
64        self.0.eq(other)
65    }
66}
67
68impl PartialEq<WindowAcknowledgementSize> for u32 {
69    fn eq(&self, other: &WindowAcknowledgementSize) -> bool {
70        self.eq(&other.0)
71    }
72}
73
74impl PartialOrd<u32> for WindowAcknowledgementSize {
75    fn partial_cmp(&self, other: &u32) -> Option<Ordering> {
76        self.0.partial_cmp(other)
77    }
78}
79
80impl PartialOrd<WindowAcknowledgementSize> for u32 {
81    fn partial_cmp(&self, other: &WindowAcknowledgementSize) -> Option<Ordering> {
82        self.partial_cmp(&other.0)
83    }
84}
85
86impl Div<u32> for WindowAcknowledgementSize {
87    type Output = Self;
88
89    fn div(self, rhs: u32) -> Self::Output {
90        Self(self.0 / rhs)
91    }
92}
93
94impl ChunkData for WindowAcknowledgementSize {
95    const CHANNEL: Channel = Channel::Network;
96    const MESSAGE_TYPE: MessageType = MessageType::WindowAcknowledgementSize;
97}
98
99impl Decoder<WindowAcknowledgementSize> for ByteBuffer {
100    /// Decodes bytes into an WindowAcknowledgementSize message.
101    ///
102    /// # Errors
103    ///
104    /// * [`InsufficientBufferLength`]
105    ///
106    /// When this buffer didn't remain at least 4 bytes.
107    ///
108    /// # Examples
109    ///
110    /// ```rust
111    /// use sheave_core::{
112    ///     ByteBuffer,
113    ///     Decoder,
114    ///     messages::WindowAcknowledgementSize
115    /// };
116    ///
117    /// let mut buffer = ByteBuffer::default();
118    /// buffer.put_u32_be(u32::default());
119    /// assert!(Decoder::<WindowAcknowledgementSize>::decode(&mut buffer).is_ok())
120    /// ```
121    ///
122    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
123    fn decode(&mut self) -> IOResult<WindowAcknowledgementSize> {
124        self.get_u32_be().map(WindowAcknowledgementSize::new)
125    }
126}
127
128impl Encoder<WindowAcknowledgementSize> for ByteBuffer {
129    /// Encodes an WindowAcknowledgementSize message into bytes.
130    fn encode(&mut self, window_acknowledgement_size: &WindowAcknowledgementSize) {
131        self.put_u32_be(window_acknowledgement_size.0);
132    }
133}
134
135#[cfg(test)]
136mod tests {
137    use super::*;
138
139    #[test]
140    fn decode_window_acknowledgement_size() {
141        let mut buffer = ByteBuffer::default();
142        buffer.put_u32_be(2500000);
143        let result: IOResult<WindowAcknowledgementSize> = buffer.decode();
144        assert!(result.is_ok());
145        let actual = result.unwrap();
146        let expected = WindowAcknowledgementSize::default();
147        assert_eq!(expected, actual)
148    }
149
150    #[test]
151    fn encode_window_acknowledgement_size() {
152        let mut buffer = ByteBuffer::default();
153        let expected_bytes = 2500000u32;
154        buffer.encode(&WindowAcknowledgementSize::default());
155        let actual_bytes = buffer.get_u32_be().unwrap();
156        assert_eq!(expected_bytes, actual_bytes)
157    }
158}