someip_parse/err/
slice_write_space_error.rs

1use super::*;
2
3/// Error when not enough space is available in a slice
4/// to write a packet or header to it.
5#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
6pub struct SliceWriteSpaceError {
7    /// Expected minimum length conflicting with the
8    /// `actual_len` value.
9    pub required_len: usize,
10
11    /// Length limiting or exceeding the required length.
12    pub len: usize,
13
14    /// Layer in which could not be written to the slice.
15    pub layer: Layer,
16}
17
18impl core::fmt::Display for SliceWriteSpaceError {
19    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
20        write!(
21            f,
22            "Not enough space to write {} to slice. Needed {} byte(s), but only {} byte(s) were available.",
23            self.layer,
24            self.required_len,
25            self.len,
26        )
27    }
28}
29
30impl std::error::Error for SliceWriteSpaceError {
31    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
32        None
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn debug_write() {
42        let _ = format!(
43            "{:?}",
44            SliceWriteSpaceError {
45                required_len: 1,
46                len: 0,
47                layer: Layer::SomeipTpHeader
48            }
49        );
50    }
51
52    #[test]
53    fn clone_eq_hash_ord() {
54        use core::cmp::Ordering;
55        use std::collections::hash_map::DefaultHasher;
56        use std::hash::{Hash, Hasher};
57
58        let err = SliceWriteSpaceError {
59            required_len: 1,
60            len: 0,
61            layer: Layer::SomeipTpHeader,
62        };
63        assert_eq!(err, err.clone());
64        let hash_a = {
65            let mut hasher = DefaultHasher::new();
66            err.hash(&mut hasher);
67            hasher.finish()
68        };
69        let hash_b = {
70            let mut hasher = DefaultHasher::new();
71            err.clone().hash(&mut hasher);
72            hasher.finish()
73        };
74        assert_eq!(hash_a, hash_b);
75        assert_eq!(Ordering::Equal, err.cmp(&err));
76        assert_eq!(Some(Ordering::Equal), err.partial_cmp(&err));
77    }
78
79    #[test]
80    fn fmt() {
81        assert_eq!(
82            format!("{}", SliceWriteSpaceError{ required_len: 4, len: 1, layer: Layer::SomeipTpHeader }),
83            "Not enough space to write SOMEIP TP header to slice. Needed 4 byte(s), but only 1 byte(s) were available."
84        );
85    }
86
87    #[test]
88    fn source() {
89        use std::error::Error;
90        assert!(SliceWriteSpaceError {
91            required_len: 4,
92            len: 1,
93            layer: Layer::SomeipTpHeader
94        }
95        .source()
96        .is_none());
97    }
98}