rl2tp/message/avp/types/
protocol_version.rs

1use crate::avp::{QueryableAVP, WritableAVP};
2use crate::common::{DecodeError, DecodeResult, Reader, Writer};
3
4#[derive(Clone, Copy, Debug, Eq, PartialEq)]
5pub struct ProtocolVersion {
6    pub version: u8,
7    pub revision: u8,
8}
9
10impl ProtocolVersion {
11    const ATTRIBUTE_TYPE: u16 = 2;
12    const LENGTH: usize = 2;
13
14    #[inline]
15    pub fn try_read<T>(reader: &mut impl Reader<T>) -> DecodeResult<Self> {
16        if reader.len() < Self::LENGTH {
17            return Err(DecodeError::IncompleteAVP(Self::ATTRIBUTE_TYPE));
18        }
19
20        let version = unsafe { reader.read_u8_unchecked() };
21        let revision = unsafe { reader.read_u8_unchecked() };
22        Ok(Self { version, revision })
23    }
24}
25
26impl QueryableAVP for ProtocolVersion {
27    #[inline]
28    fn get_length(&self) -> usize {
29        Self::LENGTH
30    }
31}
32
33impl WritableAVP for ProtocolVersion {
34    #[inline]
35    fn write(&self, writer: &mut impl Writer) {
36        writer.write_u16_be(Self::ATTRIBUTE_TYPE);
37        writer.write_bytes(&[self.version, self.revision]);
38    }
39}