Skip to content

Commit 9879b91

Browse files
authored
Use serde-content instead of private serde types (#1062)
1 parent bb718d1 commit 9879b91

6 files changed

Lines changed: 91 additions & 52 deletions

File tree

Cargo.lock

Lines changed: 25 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@ browserslist = ["browserslist-rs"]
3939
bundler = ["dashmap", "sourcemap", "rayon"]
4040
cli = ["atty", "clap", "serde_json", "browserslist", "jemallocator"]
4141
jsonschema = ["schemars", "serde", "parcel_selectors/jsonschema"]
42-
nodejs = ["dep:serde"]
42+
nodejs = ["dep:serde", "dep:serde-content"]
4343
serde = [
4444
"dep:serde",
45+
"dep:serde-content",
4546
"bitflags/serde",
4647
"smallvec/serde",
4748
"cssparser/serde",
@@ -59,7 +60,8 @@ into_owned = [
5960
substitute_variables = ["visitor", "into_owned"]
6061

6162
[dependencies]
62-
serde = { version = "1.0.201", features = ["derive"], optional = true }
63+
serde = { version = "1.0.228", features = ["derive"], optional = true }
64+
serde-content = { version = "0.1.2", features = ["serde"], optional = true }
6365
cssparser = "0.33.0"
6466
cssparser-color = "0.1.0"
6567
parcel_selectors = { version = "0.28.2", path = "./selectors" }

napi/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ bundler = ["dep:crossbeam-channel", "dep:rayon"]
1414

1515
[dependencies]
1616
serde = { version = "1.0.201", features = ["derive"] }
17+
serde-content = { version = "0.1.2", features = ["serde"] }
1718
serde_bytes = "0.11.5"
1819
cssparser = "0.33.0"
1920
lightningcss = { version = "1.0.0-alpha.66", path = "../", features = [

napi/src/transformer.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -755,9 +755,8 @@ impl<'de, V: serde::Deserialize<'de>, const IS_VEC: bool> serde::Deserialize<'de
755755
D: serde::Deserializer<'de>,
756756
{
757757
use serde::Deserializer;
758-
let content = serde::__private::de::Content::deserialize(deserializer)?;
759-
let de: serde::__private::de::ContentRefDeserializer<D::Error> =
760-
serde::__private::de::ContentRefDeserializer::new(&content);
758+
let content = serde_content::Value::deserialize(deserializer)?;
759+
let de = serde_content::Deserializer::new(content.clone()).coerce_numbers();
761760

762761
// Try to deserialize as a sequence first.
763762
let mut was_seq = false;
@@ -769,13 +768,15 @@ impl<'de, V: serde::Deserialize<'de>, const IS_VEC: bool> serde::Deserialize<'de
769768
if was_seq {
770769
// Allow fallback if we know the value is also a list (e.g. selector).
771770
if res.is_ok() || !IS_VEC {
772-
return res.map(ValueOrVec::Vec);
771+
return res.map_err(|e| serde::de::Error::custom(e.to_string())).map(ValueOrVec::Vec);
773772
}
774773
}
775774

776775
// If it wasn't a sequence, try a value.
777-
let de = serde::__private::de::ContentRefDeserializer::new(&content);
778-
return V::deserialize(de).map(ValueOrVec::Value);
776+
let de = serde_content::Deserializer::new(content).coerce_numbers();
777+
return V::deserialize(de)
778+
.map_err(|e| serde::de::Error::custom(e.to_string()))
779+
.map(ValueOrVec::Value);
779780

780781
struct SeqVisitor<'a, V> {
781782
was_seq: &'a mut bool,
@@ -811,25 +812,25 @@ impl<'i, 'de: 'i> serde::Deserialize<'de> for TokensOrRaw<'i> {
811812
where
812813
D: serde::Deserializer<'de>,
813814
{
814-
use serde::__private::de::ContentRefDeserializer;
815-
816815
#[derive(serde::Deserialize)]
817816
struct Raw<'i> {
818817
#[serde(borrow)]
819818
raw: CowArcStr<'i>,
820819
}
821820

822-
let content = serde::__private::de::Content::deserialize(deserializer)?;
823-
let de: ContentRefDeserializer<D::Error> = ContentRefDeserializer::new(&content);
821+
let content = serde_content::Value::deserialize(deserializer)?;
822+
let de = serde_content::Deserializer::new(content.clone()).coerce_numbers();
824823

825824
if let Ok(res) = Raw::deserialize(de) {
826825
let res = TokenList::parse_string_with_options(res.raw.as_ref(), ParserOptions::default())
827826
.map_err(|_| serde::de::Error::custom("Could not parse value"))?;
828827
return Ok(TokensOrRaw(ValueOrVec::Vec(res.into_owned().0)));
829828
}
830829

831-
let de = ContentRefDeserializer::new(&content);
832-
Ok(TokensOrRaw(ValueOrVec::deserialize(de)?))
830+
let de = serde_content::Deserializer::new(content).coerce_numbers();
831+
Ok(TokensOrRaw(
832+
ValueOrVec::deserialize(de).map_err(|e| serde::de::Error::custom(e.to_string()))?,
833+
))
833834
}
834835
}
835836

src/properties/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ macro_rules! define_properties {
989989
D: serde::Deserializer<'de>,
990990
{
991991
enum ContentOrRaw<'de> {
992-
Content(serde::__private::de::Content<'de>),
992+
Content(serde_content::Value<'de>),
993993
Raw(CowArcStr<'de>)
994994
}
995995

@@ -1062,26 +1062,26 @@ macro_rules! define_properties {
10621062
ContentOrRaw::Content(content) => content
10631063
};
10641064

1065-
let deserializer = serde::__private::de::ContentDeserializer::new(content);
1065+
let deserializer = serde_content::Deserializer::new(content).coerce_numbers();
10661066
match partial.property_id {
10671067
$(
10681068
$(#[$meta])*
10691069
PropertyId::$property$((vp_name!($vp, prefix)))? => {
1070-
let value = <$type>::deserialize(deserializer)?;
1070+
let value = <$type>::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
10711071
Ok(Property::$property(value $(, vp_name!($vp, prefix))?))
10721072
},
10731073
)+
10741074
PropertyId::Custom(name) => {
10751075
if name.as_ref() == "unparsed" {
1076-
let value = UnparsedProperty::deserialize(deserializer)?;
1076+
let value = UnparsedProperty::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
10771077
Ok(Property::Unparsed(value))
10781078
} else {
1079-
let value = CustomProperty::deserialize(deserializer)?;
1079+
let value = CustomProperty::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
10801080
Ok(Property::Custom(value))
10811081
}
10821082
}
10831083
PropertyId::All => {
1084-
let value = CSSWideKeyword::deserialize(deserializer)?;
1084+
let value = CSSWideKeyword::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
10851085
Ok(Property::All(value))
10861086
}
10871087
}

src/rules/mod.rs

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ impl<'i, 'de: 'i, R: serde::Deserialize<'de>> serde::Deserialize<'de> for CssRul
209209

210210
struct PartialRule<'de> {
211211
rule_type: CowArcStr<'de>,
212-
content: serde::__private::de::Content<'de>,
212+
content: serde_content::Value<'de>,
213213
}
214214

215215
struct CssRuleVisitor;
@@ -226,7 +226,7 @@ impl<'i, 'de: 'i, R: serde::Deserialize<'de>> serde::Deserialize<'de> for CssRul
226226
A: serde::de::MapAccess<'de>,
227227
{
228228
let mut rule_type: Option<CowArcStr<'de>> = None;
229-
let mut value: Option<serde::__private::de::Content> = None;
229+
let mut value: Option<serde_content::Value> = None;
230230
while let Some(key) = map.next_key()? {
231231
match key {
232232
Field::Type => {
@@ -245,108 +245,122 @@ impl<'i, 'de: 'i, R: serde::Deserialize<'de>> serde::Deserialize<'de> for CssRul
245245
}
246246

247247
let partial = deserializer.deserialize_map(CssRuleVisitor)?;
248-
let deserializer = serde::__private::de::ContentDeserializer::new(partial.content);
248+
let deserializer = serde_content::Deserializer::new(partial.content).coerce_numbers();
249249

250250
match partial.rule_type.as_ref() {
251251
"media" => {
252-
let rule = MediaRule::deserialize(deserializer)?;
252+
let rule = MediaRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
253253
Ok(CssRule::Media(rule))
254254
}
255255
"import" => {
256-
let rule = ImportRule::deserialize(deserializer)?;
256+
let rule = ImportRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
257257
Ok(CssRule::Import(rule))
258258
}
259259
"style" => {
260-
let rule = StyleRule::deserialize(deserializer)?;
260+
let rule = StyleRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
261261
Ok(CssRule::Style(rule))
262262
}
263263
"keyframes" => {
264-
let rule = KeyframesRule::deserialize(deserializer)?;
264+
let rule =
265+
KeyframesRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
265266
Ok(CssRule::Keyframes(rule))
266267
}
267268
"font-face" => {
268-
let rule = FontFaceRule::deserialize(deserializer)?;
269+
let rule = FontFaceRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
269270
Ok(CssRule::FontFace(rule))
270271
}
271272
"font-palette-values" => {
272-
let rule = FontPaletteValuesRule::deserialize(deserializer)?;
273+
let rule =
274+
FontPaletteValuesRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
273275
Ok(CssRule::FontPaletteValues(rule))
274276
}
275277
"font-feature-values" => {
276-
let rule = FontFeatureValuesRule::deserialize(deserializer)?;
278+
let rule =
279+
FontFeatureValuesRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
277280
Ok(CssRule::FontFeatureValues(rule))
278281
}
279282
"page" => {
280-
let rule = PageRule::deserialize(deserializer)?;
283+
let rule = PageRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
281284
Ok(CssRule::Page(rule))
282285
}
283286
"supports" => {
284-
let rule = SupportsRule::deserialize(deserializer)?;
287+
let rule = SupportsRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
285288
Ok(CssRule::Supports(rule))
286289
}
287290
"counter-style" => {
288-
let rule = CounterStyleRule::deserialize(deserializer)?;
291+
let rule =
292+
CounterStyleRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
289293
Ok(CssRule::CounterStyle(rule))
290294
}
291295
"namespace" => {
292-
let rule = NamespaceRule::deserialize(deserializer)?;
296+
let rule =
297+
NamespaceRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
293298
Ok(CssRule::Namespace(rule))
294299
}
295300
"moz-document" => {
296-
let rule = MozDocumentRule::deserialize(deserializer)?;
301+
let rule =
302+
MozDocumentRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
297303
Ok(CssRule::MozDocument(rule))
298304
}
299305
"nesting" => {
300-
let rule = NestingRule::deserialize(deserializer)?;
306+
let rule = NestingRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
301307
Ok(CssRule::Nesting(rule))
302308
}
303309
"nested-declarations" => {
304-
let rule = NestedDeclarationsRule::deserialize(deserializer)?;
310+
let rule = NestedDeclarationsRule::deserialize(deserializer)
311+
.map_err(|e| serde::de::Error::custom(e.to_string()))?;
305312
Ok(CssRule::NestedDeclarations(rule))
306313
}
307314
"viewport" => {
308-
let rule = ViewportRule::deserialize(deserializer)?;
315+
let rule = ViewportRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
309316
Ok(CssRule::Viewport(rule))
310317
}
311318
"custom-media" => {
312-
let rule = CustomMediaRule::deserialize(deserializer)?;
319+
let rule =
320+
CustomMediaRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
313321
Ok(CssRule::CustomMedia(rule))
314322
}
315323
"layer-statement" => {
316-
let rule = LayerStatementRule::deserialize(deserializer)?;
324+
let rule =
325+
LayerStatementRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
317326
Ok(CssRule::LayerStatement(rule))
318327
}
319328
"layer-block" => {
320-
let rule = LayerBlockRule::deserialize(deserializer)?;
329+
let rule =
330+
LayerBlockRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
321331
Ok(CssRule::LayerBlock(rule))
322332
}
323333
"property" => {
324-
let rule = PropertyRule::deserialize(deserializer)?;
334+
let rule = PropertyRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
325335
Ok(CssRule::Property(rule))
326336
}
327337
"container" => {
328-
let rule = ContainerRule::deserialize(deserializer)?;
338+
let rule =
339+
ContainerRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
329340
Ok(CssRule::Container(rule))
330341
}
331342
"scope" => {
332-
let rule = ScopeRule::deserialize(deserializer)?;
343+
let rule = ScopeRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
333344
Ok(CssRule::Scope(rule))
334345
}
335346
"starting-style" => {
336-
let rule = StartingStyleRule::deserialize(deserializer)?;
347+
let rule =
348+
StartingStyleRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
337349
Ok(CssRule::StartingStyle(rule))
338350
}
339351
"view-transition" => {
340-
let rule = ViewTransitionRule::deserialize(deserializer)?;
352+
let rule =
353+
ViewTransitionRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
341354
Ok(CssRule::ViewTransition(rule))
342355
}
343356
"ignored" => Ok(CssRule::Ignored),
344357
"unknown" => {
345-
let rule = UnknownAtRule::deserialize(deserializer)?;
358+
let rule =
359+
UnknownAtRule::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
346360
Ok(CssRule::Unknown(rule))
347361
}
348362
"custom" => {
349-
let rule = R::deserialize(deserializer)?;
363+
let rule = R::deserialize(deserializer).map_err(|e| serde::de::Error::custom(e.to_string()))?;
350364
Ok(CssRule::Custom(rule))
351365
}
352366
t => Err(serde::de::Error::unknown_variant(t, &[])),

0 commit comments

Comments
 (0)