@@ -265,12 +265,11 @@ pub mod serde {
265
265
where
266
266
D : Deserializer < ' de > ,
267
267
{
268
- let buf = d. deserialize_str ( ColonDelimVisitor ) ?;
269
- BDAddr :: from_str_delim ( buf) . map_err ( D :: Error :: custom)
268
+ d. deserialize_str ( ColonDelimVisitor )
270
269
}
271
270
272
271
impl < ' de > Visitor < ' de > for ColonDelimVisitor {
273
- type Value = & ' de str ;
272
+ type Value = BDAddr ;
274
273
275
274
fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
276
275
write ! (
@@ -279,11 +278,25 @@ pub mod serde {
279
278
)
280
279
}
281
280
281
+ fn visit_str < E > ( self , v : & str ) -> Result < Self :: Value , E >
282
+ where
283
+ E : DeError ,
284
+ {
285
+ BDAddr :: from_str_delim ( v) . map_err ( E :: custom)
286
+ }
287
+
282
288
fn visit_borrowed_str < E > ( self , v : & ' de str ) -> Result < Self :: Value , E >
283
289
where
284
290
E : DeError ,
285
291
{
286
- Ok ( v)
292
+ BDAddr :: from_str_delim ( v) . map_err ( E :: custom)
293
+ }
294
+
295
+ fn visit_string < E > ( self , v : String ) -> Result < Self :: Value , E >
296
+ where
297
+ E : DeError ,
298
+ {
299
+ BDAddr :: from_str_delim ( & v) . map_err ( E :: custom)
287
300
}
288
301
}
289
302
}
@@ -328,12 +341,11 @@ pub mod serde {
328
341
where
329
342
D : Deserializer < ' de > ,
330
343
{
331
- let buf = d. deserialize_str ( NoDelimVisitor ) ?;
332
- BDAddr :: from_str_no_delim ( buf) . map_err ( D :: Error :: custom)
344
+ d. deserialize_str ( NoDelimVisitor )
333
345
}
334
346
335
347
impl < ' de > Visitor < ' de > for NoDelimVisitor {
336
- type Value = & ' de str ;
348
+ type Value = BDAddr ;
337
349
338
350
fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
339
351
write ! (
@@ -342,11 +354,25 @@ pub mod serde {
342
354
)
343
355
}
344
356
357
+ fn visit_str < E > ( self , v : & str ) -> Result < Self :: Value , E >
358
+ where
359
+ E : DeError ,
360
+ {
361
+ BDAddr :: from_str_no_delim ( v) . map_err ( E :: custom)
362
+ }
363
+
345
364
fn visit_borrowed_str < E > ( self , v : & ' de str ) -> Result < Self :: Value , E >
346
365
where
347
366
E : DeError ,
348
367
{
349
- Ok ( v)
368
+ BDAddr :: from_str_no_delim ( v) . map_err ( E :: custom)
369
+ }
370
+
371
+ fn visit_string < E > ( self , v : String ) -> Result < Self :: Value , E >
372
+ where
373
+ E : DeError ,
374
+ {
375
+ BDAddr :: from_str_no_delim ( & v) . map_err ( E :: custom)
350
376
}
351
377
}
352
378
}
@@ -452,4 +478,47 @@ mod tests {
452
478
let addr_back: BDAddr = addr_as_hex. try_into ( ) . unwrap ( ) ;
453
479
assert_eq ! ( ADDR , addr_back) ;
454
480
}
481
+
482
+ #[ cfg( feature = "serde" ) ]
483
+ #[ test]
484
+ fn deserialize_toml_delim_bdaddr_with_struct ( ) {
485
+ use serde_cr:: Deserialize ;
486
+
487
+ #[ derive( Deserialize , PartialEq , Copy , Clone , Debug ) ]
488
+ #[ serde( crate = "serde_cr" ) ]
489
+ struct Data {
490
+ addr : BDAddr ,
491
+ }
492
+
493
+ let data = Data {
494
+ addr : BDAddr :: from ( [ 0xff , 0x00 , 0xff , 0x00 , 0xff , 0x00 ] ) ,
495
+ } ;
496
+
497
+ assert_eq ! ( toml:: from_str( r#"addr = "ff:00:ff:00:ff:00""# ) , Ok ( data) ) ;
498
+ assert ! (
499
+ matches!( toml:: from_str:: <Data >( r"addr = 0" ) , Err ( e) if e. message( ) . contains( "A colon seperated Bluetooth address, like `00:11:22:33:44:55`" ) )
500
+ ) ;
501
+ }
502
+
503
+ #[ cfg( feature = "serde" ) ]
504
+ #[ test]
505
+ fn deserialize_toml_nodelim_bdaddr_with_struct ( ) {
506
+ use serde_cr:: Deserialize ;
507
+
508
+ #[ derive( Deserialize , PartialEq , Copy , Clone , Debug ) ]
509
+ #[ serde( crate = "serde_cr" ) ]
510
+ struct Data {
511
+ #[ serde( with = "crate::serde::bdaddr::no_delim" ) ]
512
+ addr : BDAddr ,
513
+ }
514
+
515
+ let data = Data {
516
+ addr : BDAddr :: from ( [ 0xff , 0x00 , 0xff , 0x00 , 0xff , 0x00 ] ) ,
517
+ } ;
518
+
519
+ assert_eq ! ( toml:: from_str( r#"addr = "ff00ff00ff00""# ) , Ok ( data) ) ;
520
+ assert ! (
521
+ matches!( toml:: from_str:: <Data >( r"addr = 0" ) , Err ( e) if e. message( ) . contains( "A Bluetooth address without any delimiters, like `001122334455`" ) ) ,
522
+ ) ;
523
+ }
455
524
}
0 commit comments