luanti_protocol/wire/
sequence_number.rs1use 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}