Skip to content

Commit 1a55337

Browse files
authored
Add a serde feature for (de)serializing Selectors (#227)
Add a serde feature for serializing Selectors using CSS syntax
1 parent 638d731 commit 1a55337

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scraper/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ html5ever = "0.29.0"
1919
indexmap = { version = "2.7.1", optional = true }
2020
precomputed-hash = "0.1.1"
2121
selectors = "0.26.0"
22+
serde = { version = "1.0.215", optional = true }
2223
tendril = "0.4.3"
2324

2425
[dependencies.getopts]
@@ -31,6 +32,7 @@ deterministic = ["indexmap"]
3132
main = ["getopts"]
3233
atomic = []
3334
errors = []
35+
serde = ["dep:serde"]
3436

3537
[[bin]]
3638
name = "scraper"

scraper/src/selector.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ use selectors::{
1111
parser::{self, ParseRelative, SelectorList, SelectorParseErrorKind},
1212
};
1313

14+
#[cfg(feature = "serde")]
15+
use serde::{de::Visitor, Deserialize, Serialize};
16+
1417
use crate::error::SelectorErrorKind;
1518
use crate::ElementRef;
1619

@@ -80,6 +83,36 @@ impl ToCss for Selector {
8083
}
8184
}
8285

86+
#[cfg(feature = "serde")]
87+
impl Serialize for Selector {
88+
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
89+
serializer.serialize_str(&self.to_css_string())
90+
}
91+
}
92+
93+
#[cfg(feature = "serde")]
94+
impl<'de> Deserialize<'de> for Selector {
95+
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
96+
deserializer.deserialize_str(SelectorVisitor)
97+
}
98+
}
99+
100+
#[cfg(feature = "serde")]
101+
struct SelectorVisitor;
102+
103+
#[cfg(feature = "serde")]
104+
impl Visitor<'_> for SelectorVisitor {
105+
type Value = Selector;
106+
107+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
108+
write!(formatter, "a css selector string")
109+
}
110+
111+
fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
112+
Selector::parse(v).map_err(serde::de::Error::custom)
113+
}
114+
}
115+
83116
/// An implementation of `Parser` for `selectors`
84117
#[derive(Clone, Copy, Debug)]
85118
pub struct Parser;

0 commit comments

Comments
 (0)