veecle_os_data_support_someip/
length.rs

1//! SOME/IP length fields.
2
3use crate::parse::{ByteReader, Parse, ParseError};
4use crate::serialize::SerializeError;
5
6mod private {
7    pub trait Sealed {}
8
9    impl Sealed for u8 {}
10    impl Sealed for u16 {}
11    impl Sealed for u32 {}
12}
13
14/// A SOME/IP length field. Can be either [`u8`], [`u16`], or [`u32`].
15pub trait LengthField: private::Sealed + Sized {
16    /// Parses the length field and returns the length as a [`usize`].
17    fn get_length(reader: &mut ByteReader) -> Result<usize, ParseError>;
18
19    /// Creates a length field from the length as [`usize`].
20    fn from_length(length: usize) -> Result<Self, SerializeError>;
21}
22
23impl LengthField for u8 {
24    fn get_length(reader: &mut ByteReader) -> Result<usize, ParseError> {
25        Self::parse_partial(reader).map(|length| length as usize)
26    }
27
28    fn from_length(length: usize) -> Result<Self, SerializeError> {
29        length
30            .try_into()
31            .map_err(|_| SerializeError::LengthOverflow)
32    }
33}
34
35impl LengthField for u16 {
36    fn get_length(reader: &mut ByteReader) -> Result<usize, ParseError> {
37        Self::parse_partial(reader).map(|length| length as usize)
38    }
39
40    fn from_length(length: usize) -> Result<Self, SerializeError> {
41        length
42            .try_into()
43            .map_err(|_| SerializeError::LengthOverflow)
44    }
45}
46
47impl LengthField for u32 {
48    fn get_length(reader: &mut ByteReader) -> Result<usize, ParseError> {
49        Self::parse_partial(reader).map(|length| length as usize)
50    }
51
52    fn from_length(length: usize) -> Result<Self, SerializeError> {
53        length
54            .try_into()
55            .map_err(|_| SerializeError::LengthOverflow)
56    }
57}
58
59/// A type representing no length field.
60#[derive(Debug)]
61pub struct NoLengthField;
62
63/// An optional SOME/IP length field. Can be either [`u8`], [`u16`], [`u32`], or [`NoLengthField`].
64pub trait OptionalLengthField {
65    /// Parses the optional length field and returns an option containing the length as a [`usize`].
66    ///
67    /// Noop for [`NoLengthField`].
68    fn try_get_length(reader: &mut ByteReader) -> Result<Option<usize>, ParseError>;
69}
70
71impl<T> OptionalLengthField for T
72where
73    T: LengthField,
74{
75    fn try_get_length(reader: &mut ByteReader) -> Result<Option<usize>, ParseError> {
76        T::get_length(reader).map(Some)
77    }
78}
79
80impl OptionalLengthField for NoLengthField {
81    fn try_get_length(_: &mut ByteReader) -> Result<Option<usize>, ParseError> {
82        Ok(None)
83    }
84}
85
86#[cfg(test)]
87#[cfg_attr(coverage_nightly, coverage(off))]
88mod length_field {
89    use super::LengthField;
90    use crate::parse::ByteReader;
91    use crate::serialize::SerializeError;
92
93    #[test]
94    fn parse_u8() {
95        const TEST_DATA: &[u8] = &[9];
96
97        let mut reader = ByteReader::new(TEST_DATA);
98        assert_eq!(u8::get_length(&mut reader), Ok(9));
99    }
100
101    #[test]
102    fn parse_u16() {
103        const TEST_DATA: &[u8] = &[0, 9];
104
105        let mut reader = ByteReader::new(TEST_DATA);
106        assert_eq!(u16::get_length(&mut reader), Ok(9));
107    }
108
109    #[test]
110    fn parse_u32() {
111        const TEST_DATA: &[u8] = &[0, 0, 0, 9];
112
113        let mut reader = ByteReader::new(TEST_DATA);
114        assert_eq!(u32::get_length(&mut reader), Ok(9));
115    }
116
117    #[test]
118    fn from_length_u8() {
119        assert_eq!(u8::from_length(u8::MAX as usize), Ok(u8::MAX));
120        assert_eq!(
121            u8::from_length(u8::MAX as usize + 1),
122            Err(SerializeError::LengthOverflow)
123        );
124    }
125
126    #[test]
127    fn from_length_u16() {
128        assert_eq!(u16::from_length(u16::MAX as usize), Ok(u16::MAX));
129        assert_eq!(
130            u16::from_length(u16::MAX as usize + 1),
131            Err(SerializeError::LengthOverflow)
132        );
133    }
134
135    #[test]
136    fn from_length_u32() {
137        assert_eq!(u32::from_length(u32::MAX as usize), Ok(u32::MAX));
138        assert_eq!(
139            u32::from_length(u32::MAX as usize + 1),
140            Err(SerializeError::LengthOverflow)
141        );
142    }
143}
144
145#[cfg(test)]
146#[cfg_attr(coverage_nightly, coverage(off))]
147mod optional_field {
148    use super::{NoLengthField, OptionalLengthField};
149    use crate::parse::ByteReader;
150
151    #[test]
152    fn any() {
153        const TEST_DATA: &[u8] = &[0, 0, 0, 9];
154
155        let mut reader = ByteReader::new(TEST_DATA);
156        assert_eq!(u32::try_get_length(&mut reader), Ok(Some(9)));
157    }
158
159    #[test]
160    fn none() {
161        const TEST_DATA: &[u8] = &[];
162
163        let mut reader = ByteReader::new(TEST_DATA);
164        assert_eq!(NoLengthField::try_get_length(&mut reader), Ok(None));
165    }
166}