From 31d3f16254ec3f0c993d05be8f62dc81fc663406 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Wed, 26 Jul 2023 16:51:22 -0700 Subject: api: impl Deserialize for GlobSet PR #2569 --- crates/globset/src/serde_impl.rs | 48 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/crates/globset/src/serde_impl.rs b/crates/globset/src/serde_impl.rs index d3777c21..88b1574d 100644 --- a/crates/globset/src/serde_impl.rs +++ b/crates/globset/src/serde_impl.rs @@ -1,9 +1,9 @@ use serde::{ - de::{Error, Visitor}, + de::{Error, SeqAccess, Visitor}, {Deserialize, Deserializer, Serialize, Serializer}, }; -use crate::Glob; +use crate::{Glob, GlobSet, GlobSetBuilder}; impl Serialize for Glob { fn serialize( @@ -16,7 +16,7 @@ impl Serialize for Glob { struct GlobVisitor; -impl<'a> Visitor<'a> for GlobVisitor { +impl<'de> Visitor<'de> for GlobVisitor { type Value = Glob; fn expecting( @@ -42,11 +42,43 @@ impl<'de> Deserialize<'de> for Glob { } } +struct GlobSetVisitor; + +impl<'de> Visitor<'de> for GlobSetVisitor { + type Value = GlobSet; + + fn expecting( + &self, + formatter: &mut std::fmt::Formatter, + ) -> std::fmt::Result { + formatter.write_str("an array of glob patterns") + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: SeqAccess<'de>, + { + let mut builder = GlobSetBuilder::new(); + while let Some(glob) = seq.next_element()? { + builder.add(glob); + } + builder.build().map_err(serde::de::Error::custom) + } +} + +impl<'de> Deserialize<'de> for GlobSet { + fn deserialize>( + deserializer: D, + ) -> Result { + deserializer.deserialize_seq(GlobSetVisitor) + } +} + #[cfg(test)] mod tests { use std::collections::HashMap; - use crate::Glob; + use crate::{Glob, GlobSet}; #[test] fn glob_deserialize_borrowed() { @@ -85,4 +117,12 @@ mod tests { let de: Glob = serde_json::from_str(&ser).unwrap(); assert_eq!(test_glob, de); } + + #[test] + fn glob_set_deserialize() { + let j = r#" ["src/**/*.rs", "README.md"] "#; + let set: GlobSet = serde_json::from_str(j).unwrap(); + assert!(set.is_match("src/lib.rs")); + assert!(!set.is_match("Cargo.lock")); + } } -- cgit v1.2.3