rsfn_file/header/fields/
header_len.rs1use std::fmt;
2
3#[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}