@@ -279,14 +279,19 @@ impl serde::Serialize for Witness {
279
279
where
280
280
S : serde:: Serializer ,
281
281
{
282
- use serde:: ser:: SerializeSeq ;
282
+ use hashes:: hex:: ToHex ;
283
+ use serde:: ser:: SerializeSeq ;
283
284
285
+ let human_readable = serializer. is_human_readable ( ) ;
284
286
let mut seq = serializer. serialize_seq ( Some ( self . witness_elements ) ) ?;
285
287
286
288
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
+ }
288
294
}
289
-
290
295
seq. end ( )
291
296
}
292
297
}
@@ -297,8 +302,54 @@ impl<'de> serde::Deserialize<'de> for Witness {
297
302
where
298
303
D : serde:: Deserializer < ' de > ,
299
304
{
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
+ }
302
353
}
303
354
}
304
355
0 commit comments