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(Parse, Peek, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
20#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
21#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(skip))]
22#[derive(csskit_derives::NodeWithMetadata)]
23pub enum ContentKeyword {
24 #[atom(CssAtomSet::Text)]
25 Text(T![Ident]),
26 #[atom(CssAtomSet::Before)]
27 Before(T![Ident]),
28 #[atom(CssAtomSet::After)]
29 After(T![Ident]),
30 #[atom(CssAtomSet::FirstLetter)]
31 FirstLetter(T![Ident]),
32 #[atom(CssAtomSet::Marker)]
33 Marker(T![Ident]),
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39 use crate::CssAtomSet;
40 use css_parse::{assert_parse, assert_parse_error};
41
42 #[test]
43 fn size_test() {
44 assert_eq!(std::mem::size_of::<ContentFunction>(), 40);
45 assert_eq!(std::mem::size_of::<ContentKeyword>(), 16);
46 }
47
48 #[test]
49 fn test_writes() {
50 assert_parse!(CssAtomSet::ATOMS, ContentFunction, "content(text)");
51 assert_parse!(CssAtomSet::ATOMS, ContentFunction, "content(before)");
52 assert_parse!(CssAtomSet::ATOMS, ContentFunction, "content()");
53 }
54
55 #[test]
56 fn test_errors() {
57 assert_parse_error!(CssAtomSet::ATOMS, ContentFunction, "content(text before)");
58 }
59}