@ 261027.5

230726.1 · 31d3f16254ec3f0c993d05be8f62dc81fc663406

api: impl Deserialize for GlobSet

PR #2569

reading declarations

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<S: Serializer>(@@ -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<A>(self, mut seq: A) -> Result<Self::Value, A::Error>+    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<D: Deserializer<'de>>(+        deserializer: D,+    ) -> Result<Self, D::Error> {+        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"));+    } }