rl_lang/interpreter/stdlib/rl/
eval_isolated.rs1use crate::interpreter::{
2 evaluator::Evaluator,
3 stdlib::common::{extract_string, verr, vok, vs},
4 values::Value,
5};
6use crate::lexer::tokenizer::Tokenizer;
7use crate::parser::parser_logic::Parser;
8use crate::utils::source::SourceFile;
9
10pub fn func(_: &mut Evaluator, value: Value) -> Value {
11 let code = match extract_string(value, "eval_isolated") {
12 Ok(s) => s,
13 Err(e) => return verr!(vs!(e)),
14 };
15
16 let source = SourceFile::new("<eval>", code);
17
18 let tokens = match Tokenizer::lex(source.clone()) {
19 Ok(t) => t,
20 Err(e) => return verr!(vs!(e.message().to_string())),
21 };
22
23 let (ast, statements) = match Parser::parse(tokens, source.clone()) {
24 Ok(s) => s,
25 Err(e) => return verr!(vs!(e.message().to_string())),
26 };
27
28 let mut fresh_eval = Evaluator::default().with_stdlib().with_source_file(source);
29 let resolved = fresh_eval.resolver.resolve_program(ast, statements);
30
31 fresh_eval.output_buffer = Some(String::new());
32
33 let result = fresh_eval.evaluate_block(&resolved);
34 let captured = fresh_eval.output_buffer.take().unwrap_or_default();
35
36 match result {
37 Ok(_) => vok!(vs!(captured)),
38 Err(e) => verr!(vs!(e.message().to_string())),
39 }
40}