1- #[ cfg( feature = "serde" ) ]
2- use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
31use {
42 borsh:: { BorshDeserialize , BorshSerialize } ,
53 solana_program:: pubkey:: Pubkey ,
64} ;
5+ #[ cfg( feature = "serde" ) ]
6+ use {
7+ serde:: { Deserialize , Deserializer , Serialize , Serializer } ,
8+ solana_program:: short_vec,
9+ } ;
710
811struct ShortU16 ( u16 ) ;
912
@@ -52,13 +55,20 @@ impl BorshDeserialize for ShortU16 {
5255#[ derive( Clone , Debug , Eq , PartialEq ) ]
5356pub struct ShortVec < T > ( pub Vec < T > ) ;
5457
58+ fn borsh_serialize_as_short_vec < T : BorshSerialize , W : std:: io:: Write > (
59+ vec : & Vec < T > ,
60+ writer : & mut W ,
61+ ) -> std:: io:: Result < ( ) > {
62+ ShortU16 ( vec. len ( ) as u16 ) . serialize ( writer) ?;
63+ for item in vec {
64+ item. serialize ( writer) ?;
65+ }
66+ Ok ( ( ) )
67+ }
68+
5569impl < T : BorshSerialize > BorshSerialize for ShortVec < T > {
5670 fn serialize < W : std:: io:: Write > ( & self , writer : & mut W ) -> std:: io:: Result < ( ) > {
57- ShortU16 ( self . 0 . len ( ) as u16 ) . serialize ( writer) ?;
58- for item in & self . 0 {
59- item. serialize ( writer) ?;
60- }
61- Ok ( ( ) )
71+ borsh_serialize_as_short_vec ( & self . 0 , writer)
6272 }
6373}
6474
@@ -79,7 +89,7 @@ impl<T: Serialize> Serialize for ShortVec<T> {
7989 where
8090 S : Serializer ,
8191 {
82- solana_program :: short_vec:: serialize ( & self . 0 , serializer)
92+ short_vec:: serialize ( & self . 0 , serializer)
8393 }
8494}
8595
@@ -89,16 +99,31 @@ impl<'de, T: Deserialize<'de>> Deserialize<'de> for ShortVec<T> {
8999 where
90100 D : Deserializer < ' de > ,
91101 {
92- solana_program :: short_vec:: deserialize ( deserializer) . map ( ShortVec )
102+ short_vec:: deserialize ( deserializer) . map ( ShortVec )
93103 }
94104}
95105
96106#[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
97- #[ derive( BorshDeserialize , BorshSerialize , Clone , Debug , Eq , PartialEq ) ]
107+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
98108pub struct ConfigKeys {
99109 /// Each key tuple comprises a unique `Pubkey` identifier,
100110 /// and `bool` whether that key is a signer of the data.
101- pub keys : ShortVec < ( Pubkey , bool ) > ,
111+ #[ cfg_attr( feature = "serde" , serde( with = "short_vec" ) ) ]
112+ pub keys : Vec < ( Pubkey , bool ) > ,
113+ }
114+
115+ impl BorshSerialize for ConfigKeys {
116+ fn serialize < W : std:: io:: Write > ( & self , writer : & mut W ) -> std:: io:: Result < ( ) > {
117+ borsh_serialize_as_short_vec ( & self . keys , writer)
118+ }
119+ }
120+
121+ impl BorshDeserialize for ConfigKeys {
122+ fn deserialize_reader < R : std:: io:: Read > ( reader : & mut R ) -> std:: io:: Result < Self > {
123+ Ok ( ConfigKeys {
124+ keys : ShortVec :: deserialize_reader ( reader) ?. 0 ,
125+ } )
126+ }
102127}
103128
104129/// Utility for extracting the `ConfigKeys` data from the account data.
@@ -111,12 +136,16 @@ pub fn get_config_data(bytes: &[u8]) -> Result<&[u8], bincode::Error> {
111136
112137#[ cfg( test) ]
113138mod tests {
114- #[ cfg( feature = "serde" ) ]
115- use { super :: * , assert_matches:: assert_matches, bincode:: serialize} ;
116139 use {
140+ super :: * ,
117141 bincode:: deserialize,
118- solana_program:: short_vec:: { decode_shortu16_len, ShortU16 } ,
142+ solana_program:: {
143+ pubkey:: Pubkey ,
144+ short_vec:: { decode_shortu16_len, ShortU16 } ,
145+ } ,
119146 } ;
147+ #[ cfg( feature = "serde" ) ]
148+ use { assert_matches:: assert_matches, bincode:: serialize} ;
120149
121150 /// Return the serialized length.
122151 fn encode_len ( len : u16 ) -> Vec < u8 > {
@@ -225,4 +254,34 @@ mod tests {
225254 ] ;
226255 assert ! ( deserialize:: <ShortVec <u8 >>( & bytes) . is_err( ) ) ;
227256 }
257+
258+ #[ test]
259+ fn test_serialization_borsh ( ) {
260+ fn test_serialization ( data : ConfigKeys ) {
261+ let bytes = data. try_to_vec ( ) . unwrap ( ) ;
262+ let data1 = ConfigKeys :: try_from_slice ( & bytes) . unwrap ( ) ;
263+ assert_eq ! ( data, data1) ;
264+ }
265+
266+ test_serialization ( ConfigKeys { keys : vec ! [ ] } ) ;
267+
268+ test_serialization ( ConfigKeys {
269+ keys : vec ! [ ( Pubkey :: new_unique( ) , false ) ] ,
270+ } ) ;
271+
272+ test_serialization ( ConfigKeys {
273+ keys : vec ! [ ( Pubkey :: new_unique( ) , true ) , ( Pubkey :: new_unique( ) , false ) ] ,
274+ } ) ;
275+
276+ test_serialization ( ConfigKeys {
277+ keys : vec ! [
278+ ( Pubkey :: new_unique( ) , true ) ,
279+ ( Pubkey :: new_unique( ) , false ) ,
280+ ( Pubkey :: new_unique( ) , true ) ,
281+ ( Pubkey :: new_unique( ) , true ) ,
282+ ( Pubkey :: new_unique( ) , false ) ,
283+ ( Pubkey :: new_unique( ) , true ) ,
284+ ] ,
285+ } ) ;
286+ }
228287}
0 commit comments