sheave_core/messages/
window_acknowledgement_size.rs1use 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#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
31pub struct WindowAcknowledgementSize(u32);
32
33impl WindowAcknowledgementSize {
34 const DEFAULT: u32 = 2500000;
35
36 pub fn new(window_acknowledgement_size: u32) -> Self {
38 Self(window_acknowledgement_size)
39 }
40
41 pub fn get_inner(&self) -> u32 {
43 self.0
44 }
45}
46
47impl Default for WindowAcknowledgementSize {
48 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 fn decode(&mut self) -> IOResult<WindowAcknowledgementSize> {
124 self.get_u32_be().map(WindowAcknowledgementSize::new)
125 }
126}
127
128impl Encoder<WindowAcknowledgementSize> for ByteBuffer {
129 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}