veecle_os_data_support_someip/
length.rs1use 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
14pub trait LengthField: private::Sealed + Sized {
16 fn get_length(reader: &mut ByteReader) -> Result<usize, ParseError>;
18
19 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#[derive(Debug)]
61pub struct NoLengthField;
62
63pub trait OptionalLengthField {
65 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}