Skip to content

Commit 3b7c303

Browse files
committed
to be able to deserialize with toml crate
1 parent 3797294 commit 3b7c303

File tree

2 files changed

+78
-8
lines changed

2 files changed

+78
-8
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,4 @@ rand = "0.8.5"
8181
pretty_env_logger = "0.5.0"
8282
tokio = { version = "1.40.0", features = ["macros", "rt", "rt-multi-thread"] }
8383
serde_json = "1.0.128"
84+
toml = "0.8.19"

src/api/bdaddr.rs

Lines changed: 77 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -265,12 +265,11 @@ pub mod serde {
265265
where
266266
D: Deserializer<'de>,
267267
{
268-
let buf = d.deserialize_str(ColonDelimVisitor)?;
269-
BDAddr::from_str_delim(buf).map_err(D::Error::custom)
268+
d.deserialize_str(ColonDelimVisitor)
270269
}
271270

272271
impl<'de> Visitor<'de> for ColonDelimVisitor {
273-
type Value = &'de str;
272+
type Value = BDAddr;
274273

275274
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
276275
write!(
@@ -279,11 +278,25 @@ pub mod serde {
279278
)
280279
}
281280

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+
282288
fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
283289
where
284290
E: DeError,
285291
{
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)
287300
}
288301
}
289302
}
@@ -328,12 +341,11 @@ pub mod serde {
328341
where
329342
D: Deserializer<'de>,
330343
{
331-
let buf = d.deserialize_str(NoDelimVisitor)?;
332-
BDAddr::from_str_no_delim(buf).map_err(D::Error::custom)
344+
d.deserialize_str(NoDelimVisitor)
333345
}
334346

335347
impl<'de> Visitor<'de> for NoDelimVisitor {
336-
type Value = &'de str;
348+
type Value = BDAddr;
337349

338350
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
339351
write!(
@@ -342,11 +354,25 @@ pub mod serde {
342354
)
343355
}
344356

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+
345364
fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
346365
where
347366
E: DeError,
348367
{
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)
350376
}
351377
}
352378
}
@@ -452,4 +478,47 @@ mod tests {
452478
let addr_back: BDAddr = addr_as_hex.try_into().unwrap();
453479
assert_eq!(ADDR, addr_back);
454480
}
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+
}
455524
}

0 commit comments

Comments
 (0)