diff options
| author | Mel <einebeere@gmail.com> | 2021-11-14 19:31:48 +0100 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2021-11-14 19:31:48 +0100 |
| commit | 98ac2e8f26ff4d90c37bb9c9536e9eb14e31efb4 (patch) | |
| tree | f7e4b47cd4d8a370597267f8f1819e874c5aacce /src/interpret | |
| parent | 514ceb979c4ce79bfee2234cf981292ded714f66 (diff) | |
| download | rabbithole-98ac2e8f26ff4d90c37bb9c9536e9eb14e31efb4.tar.zst rabbithole-98ac2e8f26ff4d90c37bb9c9536e9eb14e31efb4.zip | |
Parse and walk str embeds.
Diffstat (limited to 'src/interpret')
| -rw-r--r-- | src/interpret/walker.rs | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/interpret/walker.rs b/src/interpret/walker.rs index 471da89..68dc388 100644 --- a/src/interpret/walker.rs +++ b/src/interpret/walker.rs @@ -2,7 +2,7 @@ use std::{cell::RefCell, rc::Rc}; use crate::parse::ast::{ expression::Expression, - nodes::{BinaryOperator as BinOp, BlockNode, SimpleLiteral, UnaryOperator as UnOp}, + nodes::{BinaryOperator as BinOp, BlockNode, SimpleLiteral, StrPart, UnaryOperator as UnOp}, statement::Statement, Program, }; @@ -140,13 +140,26 @@ impl Walker { let value = match token { SimpleLiteral::Int(int) => Value::Int(*int as i64), SimpleLiteral::Float(float) => Value::Float(*float as f64), - SimpleLiteral::Str(string) => Value::Str(string.clone()), SimpleLiteral::Bool(bool) => Value::Bool(*bool), }; Ok(value) } Expression::Block(block) => self.walk_block(block.as_ref()), + Expression::StrLiteral(node) => { + let mut buffer = String::new(); + + for part in &node.parts { + match part { + StrPart::Literal(literal) => buffer.push_str(literal), + StrPart::Embed(embed) => { + buffer.push_str(&self.walk_expression(embed)?.to_string()) + } + }; + } + + Ok(Value::Str(buffer)) + } Expression::FnLiteral(fn_node) => { let node = fn_node.as_ref().clone(); Ok(Value::Fn(Rc::new(RefCell::new(node)))) |
