aboutsummaryrefslogtreecommitdiff
path: root/src/interpret
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2021-11-14 19:31:48 +0100
committerMel <einebeere@gmail.com>2021-11-14 19:31:48 +0100
commit98ac2e8f26ff4d90c37bb9c9536e9eb14e31efb4 (patch)
treef7e4b47cd4d8a370597267f8f1819e874c5aacce /src/interpret
parent514ceb979c4ce79bfee2234cf981292ded714f66 (diff)
downloadrabbithole-98ac2e8f26ff4d90c37bb9c9536e9eb14e31efb4.tar.zst
rabbithole-98ac2e8f26ff4d90c37bb9c9536e9eb14e31efb4.zip
Parse and walk str embeds.
Diffstat (limited to 'src/interpret')
-rw-r--r--src/interpret/walker.rs17
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))))