luanti_protocol/wire/
sequence_number.rs

1use std::{
2    fmt::{self, Display},
3    ops::Add,
4};
5
6use crate::wire::{
7    deser::{Deserialize, DeserializeResult, Deserializer},
8    ser::{Serialize, SerializeResult, Serializer},
9};
10
11#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[repr(transparent)]
13pub struct WrappingSequenceNumber(u16);
14
15impl WrappingSequenceNumber {
16    pub(crate) const INITIAL: Self = Self(0xffdc);
17}
18
19impl Display for WrappingSequenceNumber {
20    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
21        self.0.fmt(formatter)
22    }
23}
24
25impl Deserialize for WrappingSequenceNumber {
26    type Output = Self;
27
28    fn deserialize(deserializer: &mut Deserializer<'_>) -> DeserializeResult<Self::Output> {
29        u16::deserialize(deserializer).map(Self)
30    }
31}
32
33impl Serialize for WrappingSequenceNumber {
34    type Input = Self;
35
36    fn serialize<S: Serializer>(value: &Self::Input, serializer: &mut S) -> SerializeResult {
37        u16::serialize(&value.0, serializer)
38    }
39}
40
41impl From<u16> for WrappingSequenceNumber {
42    fn from(value: u16) -> Self {
43        Self(value)
44    }
45}
46
47impl From<WrappingSequenceNumber> for u16 {
48    fn from(value: WrappingSequenceNumber) -> Self {
49        value.0
50    }
51}
52
53impl Add<u16> for WrappingSequenceNumber {
54    type Output = Self;
55
56    fn add(self, rhs: u16) -> Self::Output {
57        Self(self.0.wrapping_add(rhs))
58    }
59}