ethane_abi/parameter/
display.rs

1use 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            // data is stored in a H256 type on 32 bytes, so right padded 20
12            // bytes have to be extracted
13            Self::Address(data) => {
14                // unwrap is fine because we know that data is H256
15                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                // TODO do some conversion based on 2's complement?
43                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}