lgx_runtime/core/
engine.rs

1use crate::core::{Executor, Parser, Validator};
2use crate::models::{ExecutionRequest, ExecutionResponse, ValidationResult};
3use anyhow::Result;
4use tracing::{debug, error, info};
5
6pub struct Engine {
7    parser: Parser,
8    validator: Validator,
9    executor: Executor,
10}
11
12impl Engine {
13    pub fn new() -> Self {
14        Self {
15            parser: Parser::new(),
16            validator: Validator::new(),
17            executor: Executor::new(),
18        }
19    }
20
21    pub async fn execute(&self, request: ExecutionRequest) -> Result<ExecutionResponse> {
22        info!("Starting execution for request: {}", request.id);
23
24        let parsed = self.parser.parse(&request.code)?;
25        debug!("Code parsed successfully");
26
27        let validation = self.validator.validate(&parsed).await?;
28        if !validation.is_valid {
29            error!("Validation failed: {:?}", validation.errors);
30            return Ok(ExecutionResponse {
31                id: request.id,
32                success: false,
33                result: None,
34                errors: validation.errors,
35                execution_time: 0,
36            });
37        }
38
39        let result = self.executor.execute(&parsed, &request.context).await?;
40        debug!("Execution completed successfully");
41
42        Ok(ExecutionResponse {
43            id: request.id,
44            success: true,
45            result: Some(result),
46            errors: vec![],
47            execution_time: 0,
48        })
49    }
50
51    pub async fn validate(&self, code: &str) -> Result<ValidationResult> {
52        info!("Starting validation");
53        
54        let parsed = self.parser.parse(code)?;
55        let validation = self.validator.validate(&parsed).await?;
56        
57        Ok(validation)
58    }
59
60    pub async fn compile(&self, code: &str) -> Result<String> {
61        info!("Starting compilation");
62        
63        let parsed = self.parser.parse(code)?;
64        let compiled = self.executor.compile(&parsed)?;
65        
66        Ok(compiled)
67    }
68}