lgx_runtime/models/
ast.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4pub enum ASTNode {
5    Create {
6        entity: String,
7        fields: Vec<String>,
8        line: usize,
9    },
10    Read {
11        entity: String,
12        conditions: Vec<String>,
13        line: usize,
14    },
15    Update {
16        entity: String,
17        fields: Vec<String>,
18        conditions: Vec<String>,
19        line: usize,
20    },
21    Delete {
22        entity: String,
23        conditions: Vec<String>,
24        line: usize,
25    },
26    Function {
27        name: String,
28        parameters: Vec<String>,
29        body: String,
30        line: usize,
31    },
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct ParsedCode {
36    pub nodes: Vec<ASTNode>,
37    pub source: String,
38    pub line_count: usize,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct ExecutionContext {
43    pub user_id: Option<String>,
44    pub session_id: Option<String>,
45    pub environment: String,
46    pub variables: std::collections::HashMap<String, serde_json::Value>,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct ExecutionResult {
51    pub data: Vec<serde_json::Value>,
52    pub metadata: serde_json::Value,
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    #[test]
60    fn test_execution_context_creation() {
61        let mut variables = std::collections::HashMap::new();
62        variables.insert("name".to_string(), serde_json::Value::String("test".to_string()));
63        
64        let context = ExecutionContext {
65            user_id: Some("user123".to_string()),
66            session_id: Some("session456".to_string()),
67            environment: "production".to_string(),
68            variables,
69        };
70        
71        assert_eq!(context.user_id, Some("user123".to_string()));
72        assert_eq!(context.session_id, Some("session456".to_string()));
73        assert_eq!(context.environment, "production");
74        assert_eq!(context.variables.len(), 1);
75    }
76
77    #[test]
78    fn test_execution_result_creation() {
79        let data = vec![
80            serde_json::Value::String("result1".to_string()),
81            serde_json::Value::Number(serde_json::Number::from(42)),
82        ];
83        let metadata = serde_json::json!({
84            "count": 2,
85            "status": "success"
86        });
87        
88        let result = ExecutionResult {
89            data: data.clone(),
90            metadata: metadata.clone(),
91        };
92        
93        assert_eq!(result.data.len(), 2);
94        assert_eq!(result.metadata, metadata);
95    }
96
97    #[test]
98    fn test_ast_node_creation() {
99        let create_node = ASTNode::Create {
100            entity: "users".to_string(),
101            fields: vec!["name".to_string(), "email".to_string()],
102            line: 1,
103        };
104        
105        match create_node {
106            ASTNode::Create { entity, fields, line } => {
107                assert_eq!(entity, "users");
108                assert_eq!(fields.len(), 2);
109                assert_eq!(line, 1);
110            }
111            _ => panic!("Expected Create node"),
112        }
113    }
114
115    #[test]
116    fn test_parsed_code_creation() {
117        let nodes = vec![
118            ASTNode::Create {
119                entity: "test".to_string(),
120                fields: vec!["field1".to_string()],
121                line: 1,
122            }
123        ];
124        
125        let parsed = ParsedCode {
126            nodes: nodes.clone(),
127            source: "create test".to_string(),
128            line_count: 1,
129        };
130        
131        assert_eq!(parsed.nodes.len(), 1);
132        assert_eq!(parsed.source, "create test");
133        assert_eq!(parsed.line_count, 1);
134    }
135}