css_ast/functions/
image_set_function.rs1use super::prelude::*;
2use crate::{CalcableValue, Image, Resolution};
3
4#[node]
11#[derive(Parse, Peek, ToSpan, ToCursors, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[cfg_attr(feature = "serde", derive(serde::Serialize))]
13#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
14#[derive(csskit_derives::NodeWithMetadata)]
15pub struct ImageSetFunction<'a> {
16 #[atom(CssAtomSet::ImageSet)]
17 pub name: T![Function],
18 pub params: CommaSeparated<'a, ImageSetParams<'a>>,
19 #[semantic_eq(skip)]
20 pub close: T![')'],
21}
22
23#[node]
24#[derive(Parse, Peek, ToSpan, ToCursors, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
25#[cfg_attr(feature = "serde", derive(serde::Serialize))]
26#[derive(csskit_derives::NodeWithMetadata)]
27pub enum ImageSetParams<'a> {
28 Image(Image<'a>, Option<ResolutionOrType<'a>>),
29 String(T![String], Option<ResolutionOrType<'a>>),
30}
31
32#[node]
33#[derive(Parse, Peek, ToSpan, ToCursors, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
34#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
35#[derive(csskit_derives::NodeWithMetadata)]
36pub enum ResolutionOrType<'a> {
37 Resolution(CalcableValue<'a, Resolution>),
38 Type(#[atom(CssAtomSet::Type)] T![Function], T![String], #[semantic_eq(skip)] T![')']),
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44 use crate::CssAtomSet;
45 use css_parse::assert_parse;
46
47 #[test]
48 fn test_writes() {
49 assert_parse!(CssAtomSet::ATOMS, ImageSetFunction, "image-set('image.jpg'1x,'image.jpg'2x)");
50 assert_parse!(
51 CssAtomSet::ATOMS,
52 ImageSetFunction,
53 "image-set(url('1.avif')type('image/avif'),url('2.jpg')type('image/jpeg'))"
54 );
55 assert_parse!(CssAtomSet::ATOMS, ImageSetFunction, "image-set(url(foo))");
56 assert_parse!(CssAtomSet::ATOMS, ImageSetFunction, "image-set('a.jpg'calc(1x * 2))");
57 assert_parse!(CssAtomSet::ATOMS, ImageSetFunction, "image-set('a.jpg'var(--dpi))");
58 }
59}