ethane_abi/parameter/
display.rs1use super::Parameter;
2
3use ethane_types::Address;
4use std::convert::TryFrom;
5use std::fmt;
6use std::str;
7
8impl fmt::Display for Parameter {
9 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
10 match self {
11 Self::Address(data) => {
14 let address = Address::try_from(&data.into_bytes()[12..]).unwrap();
16 write!(formatter, "{}", address)
17 }
18 Self::Bool(data) => write!(formatter, "{}", data.as_bytes()[31] != 0),
19 Self::Uint(data, _) => write!(formatter, "{}", data.to_dec_string()),
20 Self::Int(data, len) => match len {
21 8 => write!(formatter, "{}", data.as_bytes()[31] as i8),
22 16 => {
23 let mut bytes = [0u8; 2];
24 bytes.copy_from_slice(&data.as_bytes()[30..]);
25 write!(formatter, "{}", i16::from_be_bytes(bytes))
26 }
27 32 => {
28 let mut bytes = [0u8; 4];
29 bytes.copy_from_slice(&data.as_bytes()[28..]);
30 write!(formatter, "{}", i32::from_be_bytes(bytes))
31 }
32 64 => {
33 let mut bytes = [0u8; 8];
34 bytes.copy_from_slice(&data.as_bytes()[24..]);
35 write!(formatter, "{}", i64::from_be_bytes(bytes))
36 }
37 128 => {
38 let mut bytes = [0u8; 16];
39 bytes.copy_from_slice(&data.as_bytes()[16..]);
40 write!(formatter, "{}", i128::from_be_bytes(bytes))
41 }
42 256 => write!(
44 formatter,
45 "0x{}",
46 data.as_bytes()
47 .iter()
48 .map(|b| format!("{:02x}", b))
49 .collect::<Vec<String>>()
50 .join("")
51 ),
52
53 _ => panic!("Invalid number!"),
54 },
55 Self::Bytes(data) | Self::FixedBytes(data) => {
56 if let Ok(string) = str::from_utf8(&data) {
57 write!(formatter, "{}", string)
58 } else {
59 write!(
60 formatter,
61 "[{}]",
62 data.iter()
63 .map(|c| format!("0x{:02x}", c))
64 .collect::<Vec<String>>()
65 .join(", ")
66 )
67 }
68 }
69 Self::String(data) => {
70 write!(formatter, "{}", String::from_utf8(data.to_vec()).unwrap())
71 }
72 _ => unimplemented!(),
73 }
74 }
75}
76
77#[cfg(test)]
78mod test {
79 use super::Parameter;
80 use ethane_types::{Address, U256};
81 use std::convert::TryFrom;
82 #[test]
83 fn display() {
84 let expected = format!(
85 "{}",
86 Parameter::from(
87 Address::try_from("0x99429f64cf4d5837620dcc293c1a537d58729b68").unwrap()
88 )
89 );
90 assert_eq!(&expected, "0x99429f64cf4d5837620dcc293c1a537d58729b68");
91
92 let expected = format!("{}", Parameter::from(true));
93 assert_eq!(&expected, "true");
94
95 let expected = format!("{}", Parameter::from(false));
96 assert_eq!(&expected, "false");
97
98 let expected = format!("{}", Parameter::new_bytes("abc".as_bytes()));
99 assert_eq!(&expected, "abc");
100
101 let expected = format!("{}", Parameter::new_fixed_bytes("hello there".as_bytes()));
102 assert_eq!(&expected, "hello there");
103
104 let expected = format!("{}", Parameter::new_bytes(&[240, 12, 13]));
105 assert_eq!(&expected, "[0xf0, 0x0c, 0x0d]");
106
107 let expected = format!("{}", Parameter::new_fixed_bytes(&[240, 12, 170]));
108 assert_eq!(&expected, "[0xf0, 0x0c, 0xaa]");
109
110 let expected = format!("{}", Parameter::from("hello world!"));
111 assert_eq!(&expected, "hello world!");
112
113 let expected = format!("{}", Parameter::from(133_u8));
114 assert_eq!(&expected, "133");
115
116 let expected = format!("{}", Parameter::from(1333_u16));
117 assert_eq!(&expected, "1333");
118
119 let expected = format!("{}", Parameter::from(1234567_u32));
120 assert_eq!(&expected, "1234567");
121
122 let expected = format!("{}", Parameter::from(u64::MAX));
123 assert_eq!(&expected, "18446744073709551615");
124
125 let expected = format!("{}", Parameter::from(200000000000000000000_u128));
126 assert_eq!(&expected, "200000000000000000000");
127
128 let expected = format!(
129 "{}",
130 Parameter::from(U256::try_from("1234567890123456789012345678901234567890").unwrap())
131 );
132 assert_eq!(
133 &expected,
134 "103929005307130220006098923584552504982110632080"
135 );
136
137 let expected = format!("{}", Parameter::from(-89i8));
138 assert_eq!(&expected, "-89");
139
140 let expected = format!("{}", Parameter::from(-1333_i16));
141 assert_eq!(&expected, "-1333");
142
143 let expected = format!("{}", Parameter::from(-1234567_i32));
144 assert_eq!(&expected, "-1234567");
145
146 let expected = format!("{}", Parameter::from(i64::MIN));
147 assert_eq!(&expected, "-9223372036854775808");
148
149 let expected = format!("{}", Parameter::new_int([1u8; 32], true));
150 assert_eq!(
151 &expected,
152 "0x0101010101010101010101010101010101010101010101010101010101010101"
153 );
154 }
155}