devalang_core/core/preprocessor/resolver/
spawn.rs1use crate::core::{
2 parser::statement::{Statement, StatementKind},
3 preprocessor::module::Module,
4 store::global::GlobalStore,
5};
6use devalang_types::Value;
7use devalang_utils::logger::{LogLevel, Logger};
8
9pub fn resolve_spawn(
10 stmt: &Statement,
11 name: String,
12 args: Vec<Value>,
13 module: &Module,
14 _path: &str,
15 global_store: &mut GlobalStore,
16) -> Statement {
17 let logger = Logger::new();
18
19 if let Some(func) = global_store.functions.functions.get(&name) {
21 let mut resolved_map = std::collections::HashMap::new();
22 resolved_map.insert("name".to_string(), Value::String(name.clone()));
23 resolved_map.insert("args".to_string(), Value::Array(args.clone()));
24 resolved_map.insert("body".to_string(), Value::Block(func.body.clone()));
25
26 return Statement {
27 kind: StatementKind::Spawn { name, args },
28 value: Value::Map(resolved_map),
29 ..stmt.clone()
30 };
31 }
32
33 if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
35 if let StatementKind::Group = stmt_box.kind {
36 if let Value::Map(map) = &stmt_box.value {
37 if let Some(Value::Block(body)) = map.get("body") {
38 let mut resolved_map = std::collections::HashMap::new();
39 resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
40 resolved_map.insert("args".to_string(), Value::Array(args.clone()));
41 resolved_map.insert("body".to_string(), Value::Block(body.clone()));
42
43 return Statement {
44 kind: StatementKind::Spawn { name, args },
45 value: Value::Map(resolved_map),
46 ..stmt.clone()
47 };
48 }
49 }
50 }
51 if let StatementKind::Pattern { .. } = stmt_box.kind {
53 let mut resolved_map = std::collections::HashMap::new();
54 resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
55 match &stmt_box.value {
57 Value::String(s) => {
58 resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
59 }
60 Value::Map(m) => {
61 if let Some(val) = m.get("pattern") {
62 resolved_map.insert("pattern".to_string(), val.clone());
63 }
64 if let Some(val) = m.get("target") {
65 resolved_map.insert("target".to_string(), val.clone());
66 }
67 }
68 _ => {}
69 }
70 resolved_map.insert("args".to_string(), Value::Array(args.clone()));
71
72 return Statement {
73 kind: StatementKind::Spawn { name, args },
74 value: Value::Map(resolved_map),
75 ..stmt.clone()
76 };
77 }
78 }
79
80 let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
82 logger.log_message(
83 LogLevel::Error,
84 &format!(
85 "Function or group '{}' not found for spawn\n → at {stacktrace}",
86 name
87 ),
88 );
89
90 Statement {
91 kind: StatementKind::Error {
92 message: format!("Function or group '{}' not found for spawn", name),
93 },
94 value: Value::Null,
95 ..stmt.clone()
96 }
97}
98
99