#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub(crate) 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::Custom(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),
}
}
}