diff options
Diffstat (limited to 'src/eval')
| -rw-r--r-- | src/eval/ops.rs | 12 | ||||
| -rw-r--r-- | src/eval/value.rs | 2 |
2 files changed, 13 insertions, 1 deletions
diff --git a/src/eval/ops.rs b/src/eval/ops.rs index c52a62ca..c4adf587 100644 --- a/src/eval/ops.rs +++ b/src/eval/ops.rs @@ -30,6 +30,7 @@ pub fn neg(value: Value) -> Value { /// Compute the sum of two values. pub fn add(lhs: Value, rhs: Value) -> Value { match (lhs, rhs) { + // Math. (Int(a), Int(b)) => Int(a + b), (Int(a), Float(b)) => Float(a as f64 + b), (Float(a), Int(b)) => Float(a + b as f64), @@ -45,14 +46,23 @@ pub fn add(lhs: Value, rhs: Value) -> Value { (Linear(a), Relative(b)) => Linear(a + b), (Linear(a), Linear(b)) => Linear(a + b), + // Collections. (Str(a), Str(b)) => Str(a + &b), (Array(a), Array(b)) => Array(concat(a, b)), (Dict(a), Dict(b)) => Dict(concat(a, b)), - // TODO: Add string and template. + // Templates. (Template(a), Template(b)) => Template(concat(a, b)), (Template(a), None) => Template(a), (None, Template(b)) => Template(b), + (Template(mut a), Str(b)) => Template({ + a.push(TemplateNode::Str(b)); + a + }), + (Str(a), Template(mut b)) => Template({ + b.insert(0, TemplateNode::Str(a)); + b + }), _ => Error, } diff --git a/src/eval/value.rs b/src/eval/value.rs index 2879e6d6..e175b9ff 100644 --- a/src/eval/value.rs +++ b/src/eval/value.rs @@ -119,6 +119,8 @@ pub enum TemplateNode { /// The evaluated expressions for the `tree`. map: ExprMap, }, + /// A template that was converted from a string. + Str(String), /// A template that can implement custom behaviour. Any(TemplateAny), } |
