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    /// Gets the acknowledgement size.
25    pub fn get_inner(&self) -> u32 {
26        self.0
27    }
28}
29
30impl PartialEq<u32> for Acknowledgement {
31    fn eq(&self, other: &u32) -> bool {
32        self.0.eq(other)
33    }
34}
35
36impl PartialEq<Acknowledgement> for u32 {
37    fn eq(&self, other: &Acknowledgement) -> bool {
38        self.eq(&other.0)
39    }
40}
41
42impl ChunkData for Acknowledgement {
43    const CHANNEL: Channel = Channel::Network;
44    const MESSAGE_TYPE: MessageType = MessageType::Acknowledgement;
45}
46
47impl Decoder<Acknowledgement> for ByteBuffer {
48    /// Decodes bytes into a Acknowledgement message.
49    ///
50    /// # Errors
51    ///
52    /// * [`InsufficientBufferLength`]
53    ///
54    /// When this buffer didn't remain at least 4 bytes.
55    ///
56    /// # Examples
57    ///
58    /// ```rust
59    /// use sheave_core::{
60    ///     ByteBuffer,
61    ///     Decoder,
62    ///     messages::{
63    ///         Acknowledgement
64    ///     }
65    /// };
66    ///
67    /// let mut buffer = ByteBuffer::default();
68    /// buffer.put_u32_be(u32::default());
69    /// assert!(Decoder::<Acknowledgement>::decode(&mut buffer).is_ok())
70    /// ```
71    ///
72    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
73    fn decode(&mut self) -> IOResult<Acknowledgement> {
74        self.get_u32_be().map(Acknowledgement::new)
75    }
76}
77
78impl Encoder<Acknowledgement> for ByteBuffer {
79    /// Encodes a Acknowledgement message into bytes.
80    fn encode(&mut self, acknowledgement: &Acknowledgement) {
81        self.put_u32_be(acknowledgement.get_inner());
82    }
83}
84
85#[cfg(test)]
86mod tests {
87    use super::*;
88
89    #[test]
90    fn decode_acknowledgement() {
91        let mut buffer = ByteBuffer::default();
92        buffer.put_u32_be(u32::default());
93        let result: IOResult<Acknowledgement> = buffer.decode();
94        assert!(result.is_ok());
95        let actual = result.unwrap();
96        let expected = Acknowledgement::default();
97        assert_eq!(expected, actual)
98    }
99
100    #[test]
101    fn encode_acknowledgement() {
102        let mut buffer = ByteBuffer::default();
103        let expected_bytes = u32::default();
104        buffer.encode(&Acknowledgement::default());
105        let actual_bytes = buffer.get_u32_be().unwrap();
106        assert_eq!(expected_bytes, actual_bytes)
107    }
108}