diff --git a/Cargo.toml b/Cargo.toml index a36a0d9..3c7d827 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,13 @@ Support for matching file paths against Unix shell style patterns. categories = ["filesystem"] rust-version = "1.63.0" +[dependencies] +serde = { version = "1.0", optional = true, default-features = false, features = ["std"] } + [dev-dependencies] # FIXME: This should be replaced by `tempfile` tempdir = "0.3" doc-comment = "0.3" + +[features] +serde = ["dep:serde"] diff --git a/README.md b/README.md index 3ad9ff8..58d4804 100644 --- a/README.md +++ b/README.md @@ -36,3 +36,7 @@ for entry in glob("/media/**/*.jpg").expect("Failed to read glob pattern") { } } ``` + +### `serde` Support + +The `Pattern` type implements `Serialize` and `Deserialize` from the `serde` crate when the `serde` feature is enabled. This allows `Pattern` instances to be easily serialized to and deserialized from various formats, such as JSON. diff --git a/src/lib.rs b/src/lib.rs index 133a17a..de60450 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,6 +54,10 @@ //! } //! } //! ``` +//! +//! # `serde` Support +//! +//! The `Pattern` type implements `Serialize` and `Deserialize` from the `serde` crate when the `serde` feature is enabled. This allows `Pattern` instances to be easily serialized to and deserialized from various formats, such as JSON. #![doc( html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", @@ -573,6 +577,27 @@ impl FromStr for Pattern { } } +#[cfg(feature = "serde")] +impl serde::ser::Serialize for Pattern { + fn serialize(&self, serializer: S) -> Result + where + S: serde::ser::Serializer, + { + serializer.serialize_str(&self.original) + } +} + +#[cfg(feature = "serde")] +impl<'de> serde::de::Deserialize<'de> for Pattern { + fn deserialize(deserializer: D) -> Result + where + D: serde::de::Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + Self::new(&s).map_err(serde::de::Error::custom) + } +} + #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] enum PatternToken { Char(char),