@@ -35,6 +35,7 @@ use serde::ser::{Serialize, Serializer};
3535/// # }
3636/// ```
3737#[ derive( Copy , Clone , Eq , Ord ) ]
38+ #[ cfg_attr( not( doc) , repr( transparent) ) ]
3839pub struct ByteArray < const N : usize > {
3940 bytes : [ u8 ; N ] ,
4041}
@@ -49,6 +50,10 @@ impl<const N: usize> ByteArray<N> {
4950 pub fn into_array ( self ) -> [ u8 ; N ] {
5051 self . bytes
5152 }
53+
54+ fn from_ref ( bytes : & [ u8 ; N ] ) -> & Self {
55+ unsafe { & * ( bytes as * const [ u8 ; N ] as * const ByteArray < N > ) }
56+ }
5257}
5358
5459impl < const N : usize > Debug for ByteArray < N > {
@@ -218,3 +223,39 @@ impl<'de, const N: usize> Deserialize<'de> for ByteArray<N> {
218223 deserializer. deserialize_bytes ( ByteArrayVisitor :: < N > )
219224 }
220225}
226+
227+ struct BorrowedByteArrayVisitor < const N : usize > ;
228+
229+ impl < ' de , const N : usize > Visitor < ' de > for BorrowedByteArrayVisitor < N > {
230+ type Value = & ' de ByteArray < N > ;
231+
232+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
233+ write ! ( formatter, "a borrowed byte array of length {}" , N )
234+ }
235+
236+ fn visit_borrowed_bytes < E > ( self , v : & ' de [ u8 ] ) -> Result < Self :: Value , E >
237+ where
238+ E : Error ,
239+ {
240+ let borrowed_byte_array: & ' de [ u8 ; N ] = v
241+ . try_into ( )
242+ . map_err ( |_| E :: invalid_length ( v. len ( ) , & self ) ) ?;
243+ Ok ( ByteArray :: from_ref ( borrowed_byte_array) )
244+ }
245+
246+ fn visit_borrowed_str < E > ( self , v : & ' de str ) -> Result < Self :: Value , E >
247+ where
248+ E : Error ,
249+ {
250+ self . visit_borrowed_bytes ( v. as_bytes ( ) )
251+ }
252+ }
253+
254+ impl < ' a , ' de : ' a , const N : usize > Deserialize < ' de > for & ' a ByteArray < N > {
255+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
256+ where
257+ D : Deserializer < ' de > ,
258+ {
259+ deserializer. deserialize_bytes ( BorrowedByteArrayVisitor :: < N > )
260+ }
261+ }
0 commit comments