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