Skip to main content

rsfn_file/header/fields/
header_len.rs

1use std::fmt;
2
3/// Tamanho total do cabeçalho em bytes.
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub enum HeaderLen {
6    Default,
7    Unknown(u16),
8}
9
10impl From<[u8; 2]> for HeaderLen {
11    fn from(value: [u8; 2]) -> Self {
12        u16::from_be_bytes(value).into()
13    }
14}
15
16impl From<u16> for HeaderLen {
17    fn from(value: u16) -> Self {
18        match value {
19            0x024c => Self::Default,
20            n => Self::Unknown(n),
21        }
22    }
23}
24
25impl HeaderLen {
26    pub fn value(&self) -> u16 {
27        match self {
28            Self::Default => 0x024c,
29            Self::Unknown(n) => *n,
30        }
31    }
32
33    pub fn describe_value(&self) -> String {
34        match self {
35            Self::Default => "588".to_string(),
36            Self::Unknown(n) => format!("{n} != 588"),
37        }
38    }
39
40    pub fn is_valid(&self) -> bool {
41        !matches!(self, Self::Unknown(_))
42    }
43
44    pub fn to_bytes(&self) -> [u8; 2] {
45        self.value().to_be_bytes()
46    }
47}
48
49impl fmt::Display for HeaderLen {
50    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51        let value = self.value();
52        let desc = self.describe_value();
53        write!(f, "0x{value:04x} [{desc}]")
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[test]
62    fn value_zero() {
63        let sut: HeaderLen = [0x00, 0x00].into();
64
65        assert_eq!(sut, HeaderLen::Unknown(0x0000));
66        assert_eq!(sut, 0x0000.into());
67        assert_eq!(sut.value(), 0x0000);
68        assert_eq!(sut.describe_value(), "0 != 588");
69        assert!(!sut.is_valid());
70        assert_eq!(sut.to_bytes(), [0x00, 0x00]);
71        assert_eq!(sut.to_string(), "0x0000 [0 != 588]");
72    }
73
74    #[test]
75    fn value_default() {
76        let sut: HeaderLen = [0x02, 0x4c].into();
77
78        assert_eq!(sut, HeaderLen::Default);
79        assert_eq!(sut, 0x024c.into());
80        assert_eq!(sut.value(), 0x024c);
81        assert_eq!(sut.describe_value(), "588");
82        assert!(sut.is_valid());
83        assert_eq!(sut.to_bytes(), [0x02, 0x4c]);
84        assert_eq!(sut.to_string(), "0x024c [588]");
85    }
86}