substreams_solana_core/
address.rs

1use crate::base58;
2
3/// A wrapper around a byte array that represents a Solana address.
4/// It provides a way to convert the address to a base58 encoded string.
5pub struct Address<'a>(pub &'a Vec<u8>);
6
7impl Address<'_> {
8    /// Returns the address as a base58 encoded string.
9    pub fn to_string(&self) -> String {
10        base58::encode(self.0)
11    }
12}
13
14impl<'a> std::fmt::Debug for Address<'a> {
15    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16        f.write_str(&base58::encode(self.0))
17    }
18}
19
20impl<'a> std::fmt::Display for Address<'a> {
21    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
22        f.write_str(&base58::encode(self.0))
23    }
24}
25
26impl AsRef<[u8]> for Address<'_> {
27    fn as_ref(&self) -> &[u8] {
28        self.0.as_slice()
29    }
30}
31
32impl PartialEq<Address<'_>> for &Address<'_> {
33    fn eq(&self, other: &Address<'_>) -> bool {
34        *self.0 == *other.0
35    }
36}
37
38impl PartialEq<Vec<u8>> for &Address<'_> {
39    fn eq(&self, other: &Vec<u8>) -> bool {
40        self.0 == other
41    }
42}
43
44impl PartialEq<Address<'_>> for Vec<u8> {
45    fn eq(&self, other: &Address) -> bool {
46        self == other.0
47    }
48}
49
50impl PartialEq<Address<'_>> for &Vec<u8> {
51    fn eq(&self, other: &Address) -> bool {
52        *self == other.0
53    }
54}
55
56impl PartialEq<&Address<'_>> for Vec<u8> {
57    fn eq(&self, other: &&Address) -> bool {
58        self == (*other)
59    }
60}
61
62impl<T: AsRef<[u8]>> PartialEq<T> for Address<'_> {
63    fn eq(&self, other: &T) -> bool {
64        self.0 == other.as_ref()
65    }
66}
67
68impl<const N: usize> PartialEq<[u8; N]> for &Address<'_> {
69    fn eq(&self, other: &[u8; N]) -> bool {
70        self.0.as_slice() == other
71    }
72}
73
74impl<const N: usize> PartialEq<Address<'_>> for [u8; N] {
75    fn eq(&self, other: &Address) -> bool {
76        self == other.0.as_slice()
77    }
78}
79
80impl<const N: usize> PartialEq<Address<'_>> for &[u8; N] {
81    fn eq(&self, other: &Address) -> bool {
82        *self == other.0.as_slice()
83    }
84}
85
86impl<const N: usize> PartialEq<&Address<'_>> for [u8; N] {
87    fn eq(&self, other: &&Address) -> bool {
88        self == other.0.as_slice()
89    }
90}
91
92#[cfg(test)]
93mod tests {
94    use super::Address;
95
96    #[test]
97    fn it_address_equality_works() {
98        let data: Vec<u8> = vec![1, 2, 3];
99        let address = Address(&data);
100
101        assert_eq!(&address, &address);
102        assert_eq!(&address, Address(&data));
103        assert_eq!(Address(&data), &address);
104        assert_eq!(Address(&data), Address(&data));
105
106        assert_eq!(address, vec![1, 2, 3]);
107        assert_eq!(&address, vec![1, 2, 3]);
108        assert_eq!(address, &vec![1, 2, 3]);
109        assert_eq!(&address, &vec![1, 2, 3]);
110
111        assert_eq!(vec![1, 2, 3], address);
112        assert_eq!(vec![1, 2, 3], &address);
113        assert_eq!(&vec![1, 2, 3], address);
114        assert_eq!(&vec![1, 2, 3], &address);
115
116        let fixed: [u8; 3] = [1, 2, 3];
117
118        assert_eq!(&address, &[1, 2, 3]);
119        assert_eq!(&address, &fixed);
120        assert_eq!(&address, [1u8, 2u8, 3u8]);
121        assert_eq!(address, &[1, 2, 3]);
122        assert_eq!(address, &fixed);
123        assert_eq!(address, [1u8, 2u8, 3u8]);
124
125        assert_eq!(&[1, 2, 3], &address);
126        assert_eq!(&fixed, &address);
127        assert_eq!([1u8, 2u8, 3u8], &address);
128        assert_eq!(&[1, 2, 3], address);
129        assert_eq!(&fixed, address);
130        assert_eq!([1u8, 2u8, 3u8], address);
131    }
132}