@@ -279,14 +279,19 @@ impl serde::Serialize for Witness {
279279 where
280280 S : serde:: Serializer ,
281281 {
282- use serde:: ser:: SerializeSeq ;
282+ use hashes:: hex:: ToHex ;
283+ use serde:: ser:: SerializeSeq ;
283284
285+ let human_readable = serializer. is_human_readable ( ) ;
284286 let mut seq = serializer. serialize_seq ( Some ( self . witness_elements ) ) ?;
285287
286288 for elem in self . iter ( ) {
287- seq. serialize_element ( & elem) ?;
289+ if human_readable {
290+ seq. serialize_element ( & elem. to_hex ( ) ) ?;
291+ } else {
292+ seq. serialize_element ( & elem) ?;
293+ }
288294 }
289-
290295 seq. end ( )
291296 }
292297}
@@ -297,8 +302,54 @@ impl<'de> serde::Deserialize<'de> for Witness {
297302 where
298303 D : serde:: Deserializer < ' de > ,
299304 {
300- let vec: Vec < Vec < u8 > > = serde:: Deserialize :: deserialize ( deserializer) ?;
301- Ok ( Witness :: from_vec ( vec) )
305+ struct Visitor ; // Human-readable visitor.
306+ impl < ' de > serde:: de:: Visitor < ' de > for Visitor
307+ {
308+ type Value = Witness ;
309+
310+ fn expecting ( & self , f : & mut core:: fmt:: Formatter ) -> core:: fmt:: Result {
311+ write ! ( f, "a sequence of hex arrays" )
312+ }
313+
314+ fn visit_seq < A : serde:: de:: SeqAccess < ' de > > ( self , mut a : A ) -> Result < Self :: Value , A :: Error >
315+ {
316+ use hashes:: hex:: FromHex ;
317+ use hashes:: hex:: Error :: * ;
318+ use serde:: de:: { self , Unexpected } ;
319+
320+ let mut ret = match a. size_hint ( ) {
321+ Some ( len) => Vec :: with_capacity ( len) ,
322+ None => Vec :: new ( ) ,
323+ } ;
324+
325+ while let Some ( elem) = a. next_element :: < String > ( ) ? {
326+ let vec = Vec :: < u8 > :: from_hex ( & elem) . map_err ( |e| {
327+ match e {
328+ InvalidChar ( b) => {
329+ match core:: char:: from_u32 ( b. into ( ) ) {
330+ Some ( c) => de:: Error :: invalid_value ( Unexpected :: Char ( c) , & "a valid hex character" ) ,
331+ None => de:: Error :: invalid_value ( Unexpected :: Unsigned ( b. into ( ) ) , & "a valid hex character" )
332+ }
333+ }
334+ OddLengthString ( len) => de:: Error :: invalid_length ( len, & "an even length string" ) ,
335+ InvalidLength ( expected, got) => {
336+ let exp = format ! ( "expected length: {}" , expected) ;
337+ de:: Error :: invalid_length ( got, & exp. as_str ( ) )
338+ }
339+ }
340+ } ) ?;
341+ ret. push ( vec) ;
342+ }
343+ Ok ( Witness :: from_vec ( ret) )
344+ }
345+ }
346+
347+ if deserializer. is_human_readable ( ) {
348+ deserializer. deserialize_seq ( Visitor )
349+ } else {
350+ let vec: Vec < Vec < u8 > > = serde:: Deserialize :: deserialize ( deserializer) ?;
351+ Ok ( Witness :: from_vec ( vec) )
352+ }
302353 }
303354}
304355
0 commit comments