lgx_runtime/models/
ast.rs1use 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}