@@ -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+
1417use crate :: error:: SelectorErrorKind ;
1518use 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 ) ]
85118pub struct Parser ;
0 commit comments