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}