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 {
42 self.0
43 }
44}
45
46impl Default for WindowAcknowledgementSize {
47 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 fn decode(&mut self) -> IOResult<WindowAcknowledgementSize> {
123 self.get_u32_be().map(WindowAcknowledgementSize::new)
124 }
125}
126
127impl Encoder<WindowAcknowledgementSize> for ByteBuffer {
128 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}