css_ast/functions/
content_function.rs1use super::prelude::*;
2
3#[derive(Peek, Parse, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
10#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
11#[derive(csskit_derives::NodeWithMetadata)]
12pub struct ContentFunction {
13 #[atom(CssAtomSet::Content)]
14 pub name: T![Function],
15 pub params: Option<ContentKeyword>,
16 pub close: T![')'],
17}
18
19#[derive(
20 Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
21)]
22#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
23#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(skip))]
24#[derive(csskit_derives::NodeWithMetadata)]
25pub enum ContentKeyword {
26 #[atom(CssAtomSet::Text)]
27 Text(T![Ident]),
28 #[atom(CssAtomSet::Before)]
29 Before(T![Ident]),
30 #[atom(CssAtomSet::After)]
31 After(T![Ident]),
32 #[atom(CssAtomSet::FirstLetter)]
33 FirstLetter(T![Ident]),
34 #[atom(CssAtomSet::Marker)]
35 Marker(T![Ident]),
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41 use crate::CssAtomSet;
42 use css_parse::{assert_parse, assert_parse_error};
43
44 #[test]
45 fn size_test() {
46 assert_eq!(std::mem::size_of::<ContentFunction>(), 40);
47 assert_eq!(std::mem::size_of::<ContentKeyword>(), 16);
48 }
49
50 #[test]
51 fn test_writes() {
52 assert_parse!(CssAtomSet::ATOMS, ContentFunction, "content(text)");
53 assert_parse!(CssAtomSet::ATOMS, ContentFunction, "content(before)");
54 assert_parse!(CssAtomSet::ATOMS, ContentFunction, "content()");
55 }
56
57 #[test]
58 fn test_errors() {
59 assert_parse_error!(CssAtomSet::ATOMS, ContentFunction, "content(text before)");
60 }
61}