Skip to main content

css_ast/types/
name_repeat.rs

1use super::prelude::*;
2use crate::{LineNames, NonEmpty};
3
4/// <https://drafts.csswg.org/css-grid-2/#typedef-name-repeat>
5///
6/// ```text,ignore
7/// <name-repeat> = repeat( [ <integer [1,∞]> | auto-fill ] , <line-names>+ )
8/// ```
9#[node]
10#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
11#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
12#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
13#[derive(csskit_derives::NodeWithMetadata)]
14pub struct NameRepeat<'a> {
15	#[atom(CssAtomSet::Repeat)]
16	pub name: T![Function],
17	pub params: NameRepeatParams<'a>,
18	#[semantic_eq(skip)]
19	pub close: T![')'],
20}
21
22/// `<integer [1,∞]> | auto-fill`
23#[syntax(" <integer [1,∞]> | auto-fill ")]
24#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
25#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
26#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
27#[derive(csskit_derives::NodeWithMetadata)]
28pub enum NameRepeatCount<'a> {}
29
30#[node]
31#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
32#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
33#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
34#[derive(csskit_derives::NodeWithMetadata)]
35pub struct NameRepeatParams<'a> {
36	pub count: NameRepeatCount<'a>,
37	#[cfg_attr(feature = "visitable", visit(skip))]
38	#[semantic_eq(skip)]
39	pub comma: T![,],
40	pub names: NonEmpty<Vec<'a, LineNames<'a>>>,
41}
42
43#[cfg(test)]
44mod tests {
45	use super::*;
46	use crate::CssAtomSet;
47	use css_parse::{assert_parse, assert_parse_error};
48
49	#[test]
50	fn test_writes() {
51		assert_parse!(CssAtomSet::ATOMS, NameRepeat, "repeat(2,[a])");
52		assert_parse!(CssAtomSet::ATOMS, NameRepeat, "repeat(auto-fill,[a] [b])");
53	}
54
55	#[test]
56	fn test_errors() {
57		assert_parse_error!(CssAtomSet::ATOMS, NameRepeat, "repeat(2,)");
58		assert_parse_error!(CssAtomSet::ATOMS, NameRepeat, "repeat(2,10px)");
59	}
60}