Skip to main content

css_ast/functions/
var_function.rs

1use super::prelude::*;
2
3/// <https://drafts.csswg.org/css-values-5/#var-notation>
4///
5/// ```text,ignore
6/// var() = var( <custom-property-name> , <declaration-value>? )
7/// ```
8#[node]
9#[derive(Peek, Parse, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
11#[cfg_attr(feature = "visitable", derive(Visitable), visit)]
12#[derive(csskit_derives::NodeWithMetadata)]
13#[metadata(uses_substitution, declaration_kinds = Computed)]
14pub struct VarFunction<'a, V> {
15	#[semantic_eq(skip)]
16	#[atom(CssAtomSet::Var)]
17	pub function: Function,
18	pub name: DashedIdent,
19	#[semantic_eq(skip)]
20	pub comma: Option<Comma>,
21	pub fallback: Option<Box<'a, V>>,
22	#[semantic_eq(skip)]
23	pub close: RightParen,
24}
25
26#[cfg(test)]
27mod tests {
28	use super::*;
29	use crate::{CalcableValue, CssAtomSet, Length, Value};
30	use css_parse::assert_parse;
31
32	type VarLength<'a> = VarFunction<'a, Value<'a, Length>>;
33	type CalcableVarLength<'a> = VarFunction<'a, CalcableValue<'a, Length>>;
34
35	#[test]
36	fn test_var_function() {
37		assert_parse!(CssAtomSet::ATOMS, VarLength, "var(--x)");
38		assert_parse!(CssAtomSet::ATOMS, VarLength, "var(--x, 10px)");
39	}
40
41	#[test]
42	fn test_calcable_var_function() {
43		assert_parse!(CssAtomSet::ATOMS, CalcableVarLength, "var(--x, calc(1px + 2px))");
44	}
45}