lgx_runtime/core/
engine.rs1use 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}