1use alloc::string::String;
7use alloc::vec::Vec;
8
9#[derive(Debug, Clone, PartialEq)]
13pub enum DecodedValue {
14 UnsignedInteger(u64),
16 SignedInteger(i64),
18 Float(f64),
20 String(String),
22 ByteArray(Vec<u8>),
24 MimeSample(Vec<u8>),
26 MimeStream(Vec<u8>),
28 Unknown,
30}
31
32impl DecodedValue {
33 #[inline]
35 pub fn is_integer(&self) -> bool {
36 matches!(
37 self,
38 DecodedValue::UnsignedInteger(_) | DecodedValue::SignedInteger(_)
39 )
40 }
41
42 #[inline]
44 pub fn is_float(&self) -> bool {
45 matches!(self, DecodedValue::Float(_))
46 }
47
48 #[inline]
50 pub fn is_string(&self) -> bool {
51 matches!(self, DecodedValue::String(_))
52 }
53
54 #[inline]
56 pub fn is_bytes(&self) -> bool {
57 matches!(
58 self,
59 DecodedValue::ByteArray(_) | DecodedValue::MimeSample(_) | DecodedValue::MimeStream(_)
60 )
61 }
62
63 pub fn as_f64(&self) -> Option<f64> {
65 match self {
66 DecodedValue::UnsignedInteger(v) => Some(*v as f64),
67 DecodedValue::SignedInteger(v) => Some(*v as f64),
68 DecodedValue::Float(v) => Some(*v),
69 _ => None,
70 }
71 }
72}
73
74impl core::fmt::Display for DecodedValue {
75 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
76 match self {
77 DecodedValue::UnsignedInteger(v) => write!(f, "{}", v),
78 DecodedValue::SignedInteger(v) => write!(f, "{}", v),
79 DecodedValue::Float(v) => write!(f, "{}", v),
80 DecodedValue::String(s) => write!(f, "{}", s),
81 DecodedValue::ByteArray(b) => write!(f, "[{} bytes]", b.len()),
82 DecodedValue::MimeSample(b) => write!(f, "[MIME sample: {} bytes]", b.len()),
83 DecodedValue::MimeStream(b) => write!(f, "[MIME stream: {} bytes]", b.len()),
84 DecodedValue::Unknown => write!(f, "<unknown>"),
85 }
86 }
87}