rs_fsring/
item.rs

1use crate::evt::Event;
2
3/// Contains raw bytes.
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub struct Item {
6    raw: Vec<u8>,
7}
8
9impl From<Item> for Vec<u8> {
10    fn from(i: Item) -> Self {
11        i.raw
12    }
13}
14
15impl From<Vec<u8>> for Item {
16    fn from(raw: Vec<u8>) -> Self {
17        Self { raw }
18    }
19}
20
21impl From<&[u8]> for Item {
22    fn from(bytes: &[u8]) -> Self {
23        Self::from(bytes.to_vec())
24    }
25}
26
27/// Contains name string.
28#[derive(Debug, Clone, PartialEq, Eq)]
29pub struct Name {
30    name: String,
31}
32impl Name {
33    pub fn as_str(&self) -> &str {
34        self.name.as_str()
35    }
36}
37impl From<String> for Name {
38    fn from(name: String) -> Self {
39        Self { name }
40    }
41}
42impl From<&str> for Name {
43    fn from(s: &str) -> Self {
44        Self::from(String::from(s))
45    }
46}
47impl From<Name> for String {
48    fn from(n: Name) -> Self {
49        n.name
50    }
51}
52impl From<u8> for Name {
53    fn from(raw: u8) -> Self {
54        let name: String = format!("{:02x}", raw);
55        Self { name }
56    }
57}
58impl TryFrom<&Name> for u8 {
59    type Error = Event;
60    fn try_from(n: &Name) -> Result<Self, Self::Error> {
61        let s: &str = n.name.as_str();
62        u8::from_str_radix(s, 16)
63            .map_err(|e| Event::UnexpectedError(format!("Invalid name: {}", e)))
64    }
65}
66
67/// A named `Item` with `Name`.
68#[derive(Debug, Clone, PartialEq, Eq)]
69pub struct NamedItem {
70    item: Item,
71    name: Name,
72}
73
74impl NamedItem {
75    pub fn new(item: Item, name: Name) -> Self {
76        Self { item, name }
77    }
78
79    pub fn as_name(&self) -> &Name {
80        &self.name
81    }
82
83    pub fn into_pair(self) -> (Name, Item) {
84        (self.name, self.item)
85    }
86
87    pub fn into_item(self) -> Item {
88        self.item
89    }
90}
91
92impl From<NamedItem> for Item {
93    fn from(named: NamedItem) -> Self {
94        named.item
95    }
96}
97
98impl From<NamedItem> for Name {
99    fn from(named: NamedItem) -> Self {
100        named.name
101    }
102}