lewp_css/domain/expressions/
calc_function.rs1use {
5 super::{CalcExpression, Expression},
6 crate::domain::units::{
7 conversions::{
8 AttributeConversion,
9 CssVariableConversion,
10 FontRelativeLengthConversion,
11 PercentageConversion,
12 ViewportPercentageLengthConversion,
13 },
14 Unit,
15 },
16 cssparser::ToCss,
17 std::{fmt, rc::Rc},
18};
19
20#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
21pub struct CalcFunction<U: Unit>(pub Rc<CalcExpression<U>>);
22
23impl<U: Unit> Default for CalcFunction<U> {
24 #[inline(always)]
25 fn default() -> Self {
26 CalcFunction(Rc::new(CalcExpression::default()))
27 }
28}
29
30impl<U: Unit> ToCss for CalcFunction<U> {
31 fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
32 dest.write_str("calc(")?;
33 self.0.to_css(dest)?;
34 dest.write_char(')')
35 }
36}
37
38impl<U: Unit> Expression<U> for CalcFunction<U> {
39 #[inline(always)]
43 fn evaluate<
44 Conversion: FontRelativeLengthConversion<U::Number>
45 + ViewportPercentageLengthConversion<U::Number>
46 + PercentageConversion<U::Number>
47 + AttributeConversion<U>
48 + CssVariableConversion,
49 >(
50 &self,
51 conversion: &Conversion,
52 ) -> Option<U::Number> {
53 self.0.evaluate(conversion)
54 }
55}