diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-01-14 12:49:26 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-01-14 12:52:24 +0100 |
| commit | 15f0434d1fdd03bc84cacaf6a39ac294a0c75789 (patch) | |
| tree | a7a8a96f4824bdeb3da3063dc1aa7a3f25729bf0 /src/model/eval.rs | |
| parent | ab03f3224078f1b8ca05bc1b65a7df4bebb5f449 (diff) | |
Eliminate literal type
Diffstat (limited to 'src/model/eval.rs')
| -rw-r--r-- | src/model/eval.rs | 105 |
1 files changed, 80 insertions, 25 deletions
diff --git a/src/model/eval.rs b/src/model/eval.rs index 70302861..789df0c7 100644 --- a/src/model/eval.rs +++ b/src/model/eval.rs @@ -270,8 +270,9 @@ impl Eval for ast::Expr { Self::SmartQuote(v) => v.eval(vm).map(Value::Content), Self::Strong(v) => v.eval(vm).map(Value::Content), Self::Emph(v) => v.eval(vm).map(Value::Content), - Self::Link(v) => v.eval(vm).map(Value::Content), Self::Raw(v) => v.eval(vm).map(Value::Content), + Self::Link(v) => v.eval(vm).map(Value::Content), + Self::Label(v) => v.eval(vm), Self::Ref(v) => v.eval(vm).map(Value::Content), Self::Heading(v) => v.eval(vm).map(Value::Content), Self::List(v) => v.eval(vm).map(Value::Content), @@ -281,8 +282,14 @@ impl Eval for ast::Expr { Self::Script(v) => v.eval(vm).map(Value::Content), Self::Frac(v) => v.eval(vm).map(Value::Content), Self::AlignPoint(v) => v.eval(vm).map(Value::Content), - Self::Lit(v) => v.eval(vm), Self::Ident(v) => v.eval(vm), + Self::None(v) => v.eval(vm), + Self::Auto(v) => v.eval(vm), + Self::Bool(v) => v.eval(vm), + Self::Int(v) => v.eval(vm), + Self::Float(v) => v.eval(vm), + Self::Numeric(v) => v.eval(vm), + Self::Str(v) => v.eval(vm), Self::Code(v) => v.eval(vm), Self::Content(v) => v.eval(vm).map(Value::Content), Self::Math(v) => v.eval(vm).map(Value::Content), @@ -435,6 +442,14 @@ impl Eval for ast::Link { } } +impl Eval for ast::Label { + type Output = Value; + + fn eval(&self, _: &mut Vm) -> SourceResult<Self::Output> { + Ok(Value::Label(Label(self.get().clone()))) + } +} + impl Eval for ast::Ref { type Output = Content; @@ -531,29 +546,6 @@ impl Eval for ast::AlignPoint { } } -impl Eval for ast::Lit { - type Output = Value; - - fn eval(&self, _: &mut Vm) -> SourceResult<Self::Output> { - Ok(match self.kind() { - ast::LitKind::None => Value::None, - ast::LitKind::Auto => Value::Auto, - ast::LitKind::Bool(v) => Value::Bool(v), - ast::LitKind::Int(v) => Value::Int(v), - ast::LitKind::Float(v) => Value::Float(v), - ast::LitKind::Numeric(v, unit) => match unit { - Unit::Length(unit) => Abs::with_unit(v, unit).into(), - Unit::Angle(unit) => Angle::with_unit(v, unit).into(), - Unit::Em => Em::new(v).into(), - Unit::Fr => Fr::new(v).into(), - Unit::Percent => Ratio::new(v / 100.0).into(), - }, - ast::LitKind::Str(v) => Value::Str(v.into()), - ast::LitKind::Label(v) => Value::Label(Label(v)), - }) - } -} - impl Eval for ast::Ident { type Output = Value; @@ -578,6 +570,69 @@ impl ast::Ident { } } +impl Eval for ast::None { + type Output = Value; + + fn eval(&self, _: &mut Vm) -> SourceResult<Self::Output> { + Ok(Value::None) + } +} + +impl Eval for ast::Auto { + type Output = Value; + + fn eval(&self, _: &mut Vm) -> SourceResult<Self::Output> { + Ok(Value::Auto) + } +} + +impl Eval for ast::Bool { + type Output = Value; + + fn eval(&self, _: &mut Vm) -> SourceResult<Self::Output> { + Ok(Value::Bool(self.get())) + } +} + +impl Eval for ast::Int { + type Output = Value; + + fn eval(&self, _: &mut Vm) -> SourceResult<Self::Output> { + Ok(Value::Int(self.get())) + } +} + +impl Eval for ast::Float { + type Output = Value; + + fn eval(&self, _: &mut Vm) -> SourceResult<Self::Output> { + Ok(Value::Float(self.get())) + } +} + +impl Eval for ast::Numeric { + type Output = Value; + + fn eval(&self, _: &mut Vm) -> SourceResult<Self::Output> { + let (v, unit) = self.get(); + Ok(match unit { + Unit::Length(unit) => Abs::with_unit(v, unit).into(), + Unit::Angle(unit) => Angle::with_unit(v, unit).into(), + Unit::Em => Em::new(v).into(), + Unit::Fr => Fr::new(v).into(), + Unit::Percent => Ratio::new(v / 100.0).into(), + }) + } +} + +impl Eval for ast::Str { + type Output = Value; + + fn eval(&self, _: &mut Vm) -> SourceResult<Self::Output> { + Ok(Value::Str(self.get().clone().into())) + } +} + impl Eval for ast::CodeBlock { type Output = Value; |
