sheave_core/messages/
acknowledgement.rs

1use std::io::Result as IOResult;
2use crate::{
3    ByteBuffer,
4    Decoder,
5    Encoder,
6    messages::{
7        Channel,
8        ChunkData,
9        headers::MessageType
10    }
11};
12
13/// The message to tell that some message length has exceeded the server-side bandwidth range.
14/// Note this must be input the total message length in receiving. (it's not bytes received.)
15#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord)]
16pub struct Acknowledgement(u32);
17
18impl Acknowledgement {
19    /// Constucts a Acknowledgement message.
20    pub fn new(acknowledgement: u32) -> Self {
21        Self(acknowledgement)
22    }
23
24    pub fn get_inner(&self) -> u32 {
25        self.0
26    }
27}
28
29impl PartialEq<u32> for Acknowledgement {
30    fn eq(&self, other: &u32) -> bool {
31        self.0.eq(other)
32    }
33}
34
35impl PartialEq<Acknowledgement> for u32 {
36    fn eq(&self, other: &Acknowledgement) -> bool {
37        self.eq(&other.0)
38    }
39}
40
41impl ChunkData for Acknowledgement {
42    const CHANNEL: Channel = Channel::Network;
43    const MESSAGE_TYPE: MessageType = MessageType::Acknowledgement;
44}
45
46impl Decoder<Acknowledgement> for ByteBuffer {
47    /// Decodes bytes into a Acknowledgement message.
48    ///
49    /// # Errors
50    ///
51    /// * [`InsufficientBufferLength`]
52    ///
53    /// When this buffer didn't remain at least 4 bytes.
54    ///
55    /// # Examples
56    ///
57    /// ```rust
58    /// use sheave_core::{
59    ///     ByteBuffer,
60    ///     Decoder,
61    ///     messages::{
62    ///         Acknowledgement
63    ///     }
64    /// };
65    ///
66    /// let mut buffer = ByteBuffer::default();
67    /// buffer.put_u32_be(u32::default());
68    /// assert!(Decoder::<Acknowledgement>::decode(&mut buffer).is_ok())
69    /// ```
70    ///
71    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
72    fn decode(&mut self) -> IOResult<Acknowledgement> {
73        self.get_u32_be().map(Acknowledgement::new)
74    }
75}
76
77impl Encoder<Acknowledgement> for ByteBuffer {
78    /// Encodes a Acknowledgement message into bytes.
79    fn encode(&mut self, acknowledgement: &Acknowledgement) {
80        self.put_u32_be(acknowledgement.0);
81    }
82}
83
84#[cfg(test)]
85mod tests {
86    use super::*;
87
88    #[test]
89    fn decode_acknowledgement() {
90        let mut buffer = ByteBuffer::default();
91        buffer.put_u32_be(u32::default());
92        let result: IOResult<Acknowledgement> = buffer.decode();
93        assert!(result.is_ok());
94        let actual = result.unwrap();
95        let expected = Acknowledgement::default();
96        assert_eq!(expected, actual)
97    }
98
99    #[test]
100    fn encode_acknowledgement() {
101        let mut buffer = ByteBuffer::default();
102        let expected_bytes = u32::default();
103        buffer.encode(&Acknowledgement::default());
104        let actual_bytes = buffer.get_u32_be().unwrap();
105        assert_eq!(expected_bytes, actual_bytes)
106    }
107}