@@ -67,6 +67,12 @@ impl From<Vec<u8>> for CanonicalAddr {
67
67
}
68
68
}
69
69
70
+ impl From < CanonicalAddr > for Vec < u8 > {
71
+ fn from ( source : CanonicalAddr ) -> Vec < u8 > {
72
+ source. 0 . into ( )
73
+ }
74
+ }
75
+
70
76
impl CanonicalAddr {
71
77
pub fn as_slice ( & self ) -> & [ u8 ] {
72
78
& self . 0 . as_slice ( )
@@ -79,6 +85,26 @@ impl CanonicalAddr {
79
85
pub fn is_empty ( & self ) -> bool {
80
86
self . 0 . is_empty ( )
81
87
}
88
+
89
+ /// Converts a `CanonicalAddr` into a vector of bytes.
90
+ ///
91
+ /// This consumes the `CanonicalAddr`, so we do not need to copy its contents.
92
+ /// It is equivalent to both `Vec::<u8>::from(addr)` and `let v: Vec<u8> = addr.into()` and just a matter of taste which one you use.
93
+ ///
94
+ /// # Examples
95
+ ///
96
+ /// Basic usage:
97
+ ///
98
+ /// ```
99
+ /// # use cosmwasm_std::CanonicalAddr;
100
+ /// let address = CanonicalAddr::from(vec![0, 187, 61, 11, 250, 0]);
101
+ /// let bytes = address.into_vec();
102
+ ///
103
+ /// assert_eq!(bytes, &[0, 187, 61, 11, 250, 0]);
104
+ /// ```
105
+ pub fn into_vec ( self ) -> Vec < u8 > {
106
+ self . into ( )
107
+ }
82
108
}
83
109
84
110
impl fmt:: Display for CanonicalAddr {
@@ -158,6 +184,40 @@ mod test {
158
184
assert_eq ! ( canonical_addr_vec. as_slice( ) , & [ 0u8 , 187 , 61 , 11 , 250 , 0 ] ) ;
159
185
}
160
186
187
+ #[ test]
188
+ fn canonical_addr_from_vec_works ( ) {
189
+ // Into<CanonicalAddr> for Vec<u8>
190
+ let original = vec ! [ 0u8 , 187 , 61 , 11 , 250 , 0 ] ;
191
+ let original_ptr = original. as_ptr ( ) ;
192
+ let addr: CanonicalAddr = original. into ( ) ;
193
+ assert_eq ! ( addr. as_slice( ) , [ 0u8 , 187 , 61 , 11 , 250 , 0 ] ) ;
194
+ assert_eq ! ( ( addr. 0 ) . 0 . as_ptr( ) , original_ptr, "must not be copied" ) ;
195
+
196
+ // From<Vec<u8>> for CanonicalAddr
197
+ let original = vec ! [ 0u8 , 187 , 61 , 11 , 250 , 0 ] ;
198
+ let original_ptr = original. as_ptr ( ) ;
199
+ let addr = CanonicalAddr :: from ( original) ;
200
+ assert_eq ! ( addr. as_slice( ) , [ 0u8 , 187 , 61 , 11 , 250 , 0 ] ) ;
201
+ assert_eq ! ( ( addr. 0 ) . 0 . as_ptr( ) , original_ptr, "must not be copied" ) ;
202
+ }
203
+
204
+ #[ test]
205
+ fn canonical_addr_into_vec_works ( ) {
206
+ // Into<Vec<u8>> for CanonicalAddr
207
+ let original = CanonicalAddr :: from ( vec ! [ 0u8 , 187 , 61 , 11 , 250 , 0 ] ) ;
208
+ let original_ptr = ( original. 0 ) . 0 . as_ptr ( ) ;
209
+ let vec: Vec < u8 > = original. into ( ) ;
210
+ assert_eq ! ( vec. as_slice( ) , [ 0u8 , 187 , 61 , 11 , 250 , 0 ] ) ;
211
+ assert_eq ! ( vec. as_ptr( ) , original_ptr, "must not be copied" ) ;
212
+
213
+ // From<CanonicalAddr> for Vec<u8>
214
+ let original = CanonicalAddr :: from ( vec ! [ 7u8 , 35 , 49 , 101 , 0 , 255 ] ) ;
215
+ let original_ptr = ( original. 0 ) . 0 . as_ptr ( ) ;
216
+ let vec = Vec :: < u8 > :: from ( original) ;
217
+ assert_eq ! ( vec. as_slice( ) , [ 7u8 , 35 , 49 , 101 , 0 , 255 ] ) ;
218
+ assert_eq ! ( vec. as_ptr( ) , original_ptr, "must not be copied" ) ;
219
+ }
220
+
161
221
#[ test]
162
222
fn canonical_addr_len ( ) {
163
223
let bytes: & [ u8 ] = & [ 0u8 , 187 , 61 , 11 , 250 , 0 ] ;
0 commit comments