substreams_solana_core/
address.rs1use crate::base58;
2
3pub struct Address<'a>(pub &'a Vec<u8>);
6
7impl Address<'_> {
8 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}