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    pub fn get_inner(&self) -> u32 {
42        self.0
43    }
44}
45
46impl Default for WindowAcknowledgementSize {
47    /// Constructs an WindowAcknowledgementSize message with the default bandwidth (2500000 in bits).
48    ///
49    /// # Examples
50    ///
51    /// ```rust
52    /// use sheave_core::messages::WindowAcknowledgementSize;
53    ///
54    /// assert_eq!(2500000u32, WindowAcknowledgementSize::default())
55    /// ```
56    fn default() -> Self {
57        Self(Self::DEFAULT)
58    }
59}
60
61impl PartialEq<u32> for WindowAcknowledgementSize {
62    fn eq(&self, other: &u32) -> bool {
63        self.0.eq(other)
64    }
65}
66
67impl PartialEq<WindowAcknowledgementSize> for u32 {
68    fn eq(&self, other: &WindowAcknowledgementSize) -> bool {
69        self.eq(&other.0)
70    }
71}
72
73impl PartialOrd<u32> for WindowAcknowledgementSize {
74    fn partial_cmp(&self, other: &u32) -> Option<Ordering> {
75        self.0.partial_cmp(other)
76    }
77}
78
79impl PartialOrd<WindowAcknowledgementSize> for u32 {
80    fn partial_cmp(&self, other: &WindowAcknowledgementSize) -> Option<Ordering> {
81        self.partial_cmp(&other.0)
82    }
83}
84
85impl Div<u32> for WindowAcknowledgementSize {
86    type Output = Self;
87
88    fn div(self, rhs: u32) -> Self::Output {
89        Self(self.0 / rhs)
90    }
91}
92
93impl ChunkData for WindowAcknowledgementSize {
94    const CHANNEL: Channel = Channel::Network;
95    const MESSAGE_TYPE: MessageType = MessageType::WindowAcknowledgementSize;
96}
97
98impl Decoder<WindowAcknowledgementSize> for ByteBuffer {
99    /// Decodes bytes into an WindowAcknowledgementSize message.
100    ///
101    /// # Errors
102    ///
103    /// * [`InsufficientBufferLength`]
104    ///
105    /// When this buffer didn't remain at least 4 bytes.
106    ///
107    /// # Examples
108    ///
109    /// ```rust
110    /// use sheave_core::{
111    ///     ByteBuffer,
112    ///     Decoder,
113    ///     messages::WindowAcknowledgementSize
114    /// };
115    ///
116    /// let mut buffer = ByteBuffer::default();
117    /// buffer.put_u32_be(u32::default());
118    /// assert!(Decoder::<WindowAcknowledgementSize>::decode(&mut buffer).is_ok())
119    /// ```
120    ///
121    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
122    fn decode(&mut self) -> IOResult<WindowAcknowledgementSize> {
123        self.get_u32_be().map(WindowAcknowledgementSize::new)
124    }
125}
126
127impl Encoder<WindowAcknowledgementSize> for ByteBuffer {
128    /// Encodes an WindowAcknowledgementSize message into bytes.
129    fn encode(&mut self, window_acknowledgement_size: &WindowAcknowledgementSize) {
130        self.put_u32_be(window_acknowledgement_size.0);
131    }
132}
133
134#[cfg(test)]
135mod tests {
136    use super::*;
137
138    #[test]
139    fn decode_window_acknowledgement_size() {
140        let mut buffer = ByteBuffer::default();
141        buffer.put_u32_be(2500000);
142        let result: IOResult<WindowAcknowledgementSize> = buffer.decode();
143        assert!(result.is_ok());
144        let actual = result.unwrap();
145        let expected = WindowAcknowledgementSize::default();
146        assert_eq!(expected, actual)
147    }
148
149    #[test]
150    fn encode_window_acknowledgement_size() {
151        let mut buffer = ByteBuffer::default();
152        let expected_bytes = 2500000u32;
153        buffer.encode(&WindowAcknowledgementSize::default());
154        let actual_bytes = buffer.get_u32_be().unwrap();
155        assert_eq!(expected_bytes, actual_bytes)
156    }
157}