@@ -213,7 +213,32 @@ impl SecretKey {
213213 }
214214}
215215
216- serde_impl ! ( SecretKey , constants:: SECRET_KEY_SIZE ) ;
216+ #[ cfg( feature = "serde" ) ]
217+ impl :: serde:: Serialize for SecretKey {
218+ fn serialize < S : :: serde:: Serializer > ( & self , s : S ) -> Result < S :: Ok , S :: Error > {
219+ if s. is_human_readable ( ) {
220+ s. collect_str ( self )
221+ } else {
222+ s. serialize_bytes ( & self [ ..] )
223+ }
224+ }
225+ }
226+
227+ #[ cfg( feature = "serde" ) ]
228+ impl < ' de > :: serde:: Deserialize < ' de > for SecretKey {
229+ fn deserialize < D : :: serde:: Deserializer < ' de > > ( d : D ) -> Result < Self , D :: Error > {
230+ if d. is_human_readable ( ) {
231+ d. deserialize_str ( super :: serde_util:: HexVisitor :: new (
232+ "a hex string representing 32 byte SecretKey"
233+ ) )
234+ } else {
235+ d. deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
236+ "raw 32 bytes SecretKey" ,
237+ SecretKey :: from_slice
238+ ) )
239+ }
240+ }
241+ }
217242
218243impl PublicKey {
219244 /// Obtains a raw const pointer suitable for use with FFI functions
@@ -402,7 +427,32 @@ impl From<ffi::PublicKey> for PublicKey {
402427 }
403428}
404429
405- serde_impl_from_slice ! ( PublicKey ) ;
430+ #[ cfg( feature = "serde" ) ]
431+ impl :: serde:: Serialize for PublicKey {
432+ fn serialize < S : :: serde:: Serializer > ( & self , s : S ) -> Result < S :: Ok , S :: Error > {
433+ if s. is_human_readable ( ) {
434+ s. collect_str ( self )
435+ } else {
436+ s. serialize_bytes ( & self . serialize ( ) )
437+ }
438+ }
439+ }
440+
441+ #[ cfg( feature = "serde" ) ]
442+ impl < ' de > :: serde:: Deserialize < ' de > for PublicKey {
443+ fn deserialize < D : :: serde:: Deserializer < ' de > > ( d : D ) -> Result < PublicKey , D :: Error > {
444+ if d. is_human_readable ( ) {
445+ d. deserialize_str ( super :: serde_util:: HexVisitor :: new (
446+ "an ASCII hex string representing a public key"
447+ ) )
448+ } else {
449+ d. deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
450+ "a bytestring representing a public key" ,
451+ PublicKey :: from_slice
452+ ) )
453+ }
454+ }
455+ }
406456
407457impl PartialOrd for PublicKey {
408458 fn partial_cmp ( & self , other : & PublicKey ) -> Option < :: core:: cmp:: Ordering > {
@@ -846,8 +896,20 @@ mod test {
846896 let pk = PublicKey :: from_secret_key ( & s, & sk) ;
847897
848898 assert_tokens ( & sk. compact ( ) , & [ Token :: BorrowedBytes ( & SK_BYTES [ ..] ) ] ) ;
899+ assert_tokens ( & sk. compact ( ) , & [ Token :: Bytes ( & SK_BYTES ) ] ) ;
900+ assert_tokens ( & sk. compact ( ) , & [ Token :: ByteBuf ( & SK_BYTES ) ] ) ;
901+
849902 assert_tokens ( & sk. readable ( ) , & [ Token :: BorrowedStr ( SK_STR ) ] ) ;
903+ assert_tokens ( & sk. readable ( ) , & [ Token :: Str ( SK_STR ) ] ) ;
904+ assert_tokens ( & sk. readable ( ) , & [ Token :: String ( SK_STR ) ] ) ;
905+
850906 assert_tokens ( & pk. compact ( ) , & [ Token :: BorrowedBytes ( & PK_BYTES [ ..] ) ] ) ;
907+ assert_tokens ( & pk. compact ( ) , & [ Token :: Bytes ( & PK_BYTES ) ] ) ;
908+ assert_tokens ( & pk. compact ( ) , & [ Token :: ByteBuf ( & PK_BYTES ) ] ) ;
909+
851910 assert_tokens ( & pk. readable ( ) , & [ Token :: BorrowedStr ( PK_STR ) ] ) ;
911+ assert_tokens ( & pk. readable ( ) , & [ Token :: Str ( PK_STR ) ] ) ;
912+ assert_tokens ( & pk. readable ( ) , & [ Token :: String ( PK_STR ) ] ) ;
913+
852914 }
853915}
0 commit comments