Skip to main content

css_ast/functions/
leader_function.rs

1use super::prelude::*;
2
3/// <https://drafts.csswg.org/css-content-3/#leader-function>
4///
5/// ```text,ignore
6/// leader() = leader( <leader-type> )
7/// <leader-type> = dotted | solid | space | <string>
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 LeaderFunction {
15	#[atom(CssAtomSet::Leader)]
16	pub name: T![Function],
17	pub params: LeaderType,
18	#[semantic_eq(skip)]
19	pub close: T![')'],
20}
21
22/// <https://drafts.csswg.org/css-content-3/#typedef-leader-type>
23///
24/// ```text,ignore
25/// <leader-type> = dotted | solid | space | <string>
26/// ```
27#[node]
28#[derive(
29	Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
30)]
31#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
32#[derive(csskit_derives::NodeWithMetadata)]
33pub enum LeaderType {
34	#[atom(CssAtomSet::Dotted)]
35	Dotted(T![Ident]),
36	#[atom(CssAtomSet::Solid)]
37	Solid(T![Ident]),
38	#[atom(CssAtomSet::Space)]
39	Space(T![Ident]),
40	String(T![String]),
41}
42
43#[cfg(test)]
44mod tests {
45	use super::*;
46	use crate::CssAtomSet;
47	use css_parse::{assert_parse, assert_parse_error, assert_peek_false};
48
49	#[test]
50	fn test_writes() {
51		assert_parse!(CssAtomSet::ATOMS, LeaderType, "dotted");
52		assert_parse!(CssAtomSet::ATOMS, LeaderType, "'.'");
53		assert_parse!(CssAtomSet::ATOMS, LeaderType, "'abc'");
54		assert_parse!(CssAtomSet::ATOMS, LeaderFunction, "leader(dotted)");
55		assert_parse!(CssAtomSet::ATOMS, LeaderFunction, "leader('.')");
56	}
57
58	#[test]
59	fn test_errors() {
60		assert_peek_false!(CssAtomSet::ATOMS, LeaderType, "foo");
61		assert_parse_error!(CssAtomSet::ATOMS, LeaderFunction, "leader(foo)");
62	}
63}