mini_builder_rs/evaluator/
contained_evaluator.rs1use std::pin::Pin;
2
3use crate::{
4 parser::{
5 node::{Node, Nodes},
6 Parser,
7 },
8 tokenizer::{Tokenizer, TokenizerOptions},
9};
10
11use super::{
12 evaluation_context::EvaluationContext,
13 evaluator::{Evaluator, EvaluatorBuilder},
14 evaluator_builder_error::EvaluatorBuilderError,
15 Evaluate,
16};
17
18pub struct ContainedEvaluator<'a> {
20 _source: Pin<Box<String>>,
22 _nodes: Pin<Box<Nodes<'a>>>,
23 _source_slice: &'a str,
25 _nodes_slice: &'a [Box<Node<'a>>],
26 pub evaluator: Evaluator<'a, 'a>,
28}
29
30impl<'a> ContainedEvaluator<'a> {
31 pub fn from_string(source: String) -> Result<Self, EvaluatorBuilderError> {
32 let source = Box::pin(source);
34 let source_slice = unsafe {
35 std::str::from_utf8_unchecked(std::slice::from_raw_parts(source.as_ptr(), source.len()))
36 };
37
38 let tokens =
40 Box::pin(Tokenizer::new(source_slice, TokenizerOptions::default()).tokenize()?);
41 let tokens_slice =
42 unsafe { std::slice::from_raw_parts(tokens.as_slice().as_ptr(), tokens.len()) };
43
44 let nodes = Box::pin(Parser::new(tokens_slice).parse()?);
46 let nodes_slice =
47 unsafe { std::slice::from_raw_parts(nodes.as_slice().as_ptr(), nodes.len()) };
48
49 let mut evaluator_builder = EvaluatorBuilder::new(nodes_slice);
51 let evaluator = evaluator_builder.build_evaluator()?;
52
53 Ok(Self {
54 _source: source,
56 _nodes: nodes,
57 _source_slice: source_slice,
59 _nodes_slice: nodes_slice,
60 evaluator,
61 })
62 }
63}
64
65impl<'a> Evaluate for ContainedEvaluator<'a> {
66 fn evaluate<'ea>(&self, context: &mut EvaluationContext<'ea, impl Evaluate>) -> String {
67 self.evaluator.evaluate(context)
68 }
69
70 fn get_dependencies(&self) -> &super::Dependencies {
71 self.evaluator.get_dependencies()
72 }
73}