Skip to main content

rib/interpreter/
eval.rs

1use crate::{
2    DefaultWorkerNameGenerator, Expr, GenerateInstanceName, RibCompilationError, RibCompiler,
3    RibCompilerConfig, RibComponentFunctionInvoke, RibInput, RibResult, RibRuntimeError,
4};
5use std::sync::Arc;
6
7pub struct RibEvalConfig {
8    compiler_config: RibCompilerConfig,
9    rib_input: RibInput,
10    function_invoke: Arc<dyn RibComponentFunctionInvoke + Sync + Send>,
11    generate_instance_name: Arc<dyn GenerateInstanceName + Sync + Send>,
12}
13
14impl RibEvalConfig {
15    pub fn new(
16        compiler_config: RibCompilerConfig,
17        rib_input: RibInput,
18        function_invoke: Arc<dyn RibComponentFunctionInvoke + Sync + Send>,
19        generate_worker_name: Option<Arc<dyn GenerateInstanceName + Sync + Send>>,
20    ) -> Self {
21        RibEvalConfig {
22            compiler_config,
23            rib_input,
24            function_invoke,
25            generate_instance_name: generate_worker_name
26                .unwrap_or_else(|| Arc::new(DefaultWorkerNameGenerator)),
27        }
28    }
29}
30
31pub struct RibEvaluator {
32    pub config: RibEvalConfig,
33}
34
35impl RibEvaluator {
36    pub fn new(config: RibEvalConfig) -> Self {
37        RibEvaluator { config }
38    }
39
40    pub async fn eval(self, rib: &str) -> Result<RibResult, RibEvaluationError> {
41        let expr = Expr::from_text(rib).map_err(RibEvaluationError::ParseError)?;
42        let config = self.config.compiler_config;
43        let compiler = RibCompiler::new(config);
44        let compiled = compiler.compile(expr.clone())?;
45
46        let result = crate::interpret(
47            compiled.byte_code,
48            self.config.rib_input,
49            self.config.function_invoke,
50            Some(self.config.generate_instance_name.clone()),
51        )
52        .await?;
53
54        Ok(result)
55    }
56}
57
58#[derive(Debug)]
59pub enum RibEvaluationError {
60    ParseError(String),
61    CompileError(RibCompilationError),
62    RuntimeError(RibRuntimeError),
63}
64
65impl From<RibCompilationError> for RibEvaluationError {
66    fn from(error: RibCompilationError) -> Self {
67        RibEvaluationError::CompileError(error)
68    }
69}
70
71impl From<RibRuntimeError> for RibEvaluationError {
72    fn from(error: RibRuntimeError) -> Self {
73        RibEvaluationError::RuntimeError(error)
74    }
75}