1use crate::{
2 decode::Decode,
3 encode::Encode,
4 into_type::IntoType,
5 Error,
6};
7use std::{
8 borrow::Cow,
9 convert::{
10 TryFrom,
11 TryInto,
12 },
13};
14
15pub struct Address(pub [u8; 32]);
17
18impl TryFrom<&str> for Address {
19 type Error = Error;
20
21 fn try_from(value: &str) -> Result<Address, crate::Error> {
22 let s = match value.len() {
24 40 => value,
25 42 => value.split_at(2).1,
26 _ => value,
27 };
28
29 let slice = hex::decode(&s)?;
30 let slice: [u8; 24] = slice.as_slice().try_into()?;
31 let mut buf = [0u8; 32];
32 buf[12..].copy_from_slice(&slice);
33 Ok(Address(buf))
34 }
35}
36
37impl TryFrom<&[u8]> for Address {
38 type Error = Error;
39
40 fn try_from(value: &[u8]) -> Result<Address, crate::Error> {
41 let slice: [u8; 20] = value.try_into()?;
42 let mut buf = [0u8; 32];
43 buf[12..].copy_from_slice(&slice);
44 Ok(Address(buf))
45 }
46}
47
48impl TryFrom<&Vec<u8>> for Address {
49 type Error = Error;
50
51 fn try_from(value: &Vec<u8>) -> Result<Address, crate::Error> {
52 let slice: [u8; 20] = value.as_slice().try_into()?;
53 let mut buf = [0u8; 32];
54 buf[12..].copy_from_slice(&slice);
55 Ok(Address(buf))
56 }
57}
58
59impl TryFrom<Vec<u8>> for Address {
60 type Error = Error;
61
62 fn try_from(value: Vec<u8>) -> Result<Address, crate::Error> {
63 let slice: [u8; 20] = value.as_slice().try_into()?;
64 let mut buf = [0u8; 32];
65 buf[12..].copy_from_slice(&slice);
66 Ok(Address(buf))
67 }
68}
69
70impl Encode for Address {
71 fn encode(&self) -> Vec<u8> {
72 self.0.to_vec()
73 }
74}
75
76impl<'a> Decode<'a> for Address {
77 fn decode(buf: &'a [u8]) -> Self {
78 Address(buf[0..32].try_into().unwrap())
79 }
80}
81
82impl IntoType for Address {
83 fn into_type() -> Cow<'static, str> {
84 Cow::Borrowed("address")
85 }
86}