use {
super::{
AttrExpression,
AttrFunction,
CalcExpression,
CalcFunction,
CalculablePropertyValue::{self, *},
VarExpression,
VarFunction,
},
crate::{domain::units::Unit, parsers::ParserContext, CustomParseError},
cssparser::{CowRcStr, ParseError, Parser},
either::{Either, Left},
std::rc::Rc,
FunctionParser::*,
};
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum FunctionParser {
attr,
calc,
var,
parentheses,
}
impl FunctionParser {
#[inline(always)]
pub(crate) fn parser<'i>(
name: &CowRcStr<'i>,
) -> Result<Self, ParseError<'i, CustomParseError<'i>>> {
match_ignore_ascii_case! {
&*name,
"attr" => Ok(attr),
"calc" => Ok(calc),
"var" => Ok(var),
_ => Err(ParseError::from(CustomParseError::UnknownFunctionInValueExpression(name.to_owned())))
}
}
#[inline(always)]
pub(crate) fn parse_one_outside_calc_function<'i: 't, 't, U: Unit>(
&self,
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<CalculablePropertyValue<U>, ParseError<'i, CustomParseError<'i>>>
{
match *self {
attr => Ok(Attr(AttrFunction(Rc::new(AttrExpression::parse(
context, input,
)?)))),
calc => Ok(Calc(CalcFunction(Rc::new(CalcExpression::parse(
context, input,
)?)))),
var => Ok(Var(VarFunction(Rc::new(VarExpression::parse(
context, input,
)?)))),
_ => panic!("Should not be called in this context"),
}
}
#[inline(always)]
pub(crate) fn parse_one_inside_calc_function<'i, 't, U: Unit>(
&self,
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<
Either<CalculablePropertyValue<U>, CalcExpression<U>>,
ParseError<'i, CustomParseError<'i>>,
> {
match *self {
attr => Ok(Left(Calc(CalcFunction(Rc::new(
CalcExpression::parse(context, input)?,
))))),
calc => Ok(Left(Attr(AttrFunction(Rc::new(
AttrExpression::parse(context, input)?,
))))),
var => Ok(Left(Var(VarFunction(Rc::new(VarExpression::parse(
context, input,
)?))))),
parentheses => CalcExpression::parse_parentheses(context, input),
}
}
}