css_ast/functions/
image_set_function.rs1use super::prelude::*;
2use crate::{CalcableValue, Image, Resolution};
3
4#[derive(Parse, Peek, ToSpan, ToCursors, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
11#[cfg_attr(feature = "serde", derive(serde::Serialize))]
12#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
13#[derive(csskit_derives::NodeWithMetadata)]
14pub struct ImageSetFunction<'a> {
15 #[atom(CssAtomSet::ImageSet)]
16 pub name: T![Function],
17 pub params: CommaSeparated<'a, ImageSetParams<'a>>,
18 #[semantic_eq(skip)]
19 pub close: T![')'],
20}
21
22#[derive(Parse, Peek, ToSpan, ToCursors, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize))]
24pub enum ImageSetParams<'a> {
25 Image(Image<'a>, Option<ResolutionOrType<'a>>),
26 String(T![String], Option<ResolutionOrType<'a>>),
27}
28
29#[derive(Parse, Peek, ToSpan, ToCursors, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
30#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
31pub enum ResolutionOrType<'a> {
32 Resolution(CalcableValue<'a, Resolution>),
33 Type(#[atom(CssAtomSet::Type)] T![Function], T![String], #[semantic_eq(skip)] T![')']),
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39 use crate::CssAtomSet;
40 use css_parse::assert_parse;
41
42 #[test]
43 fn size_test() {
44 assert_eq!(std::mem::size_of::<ImageSetFunction>(), 48);
45 }
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}