1use crate::evt::Event;
2
3#[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#[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#[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}