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 }
52
53 let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
55 logger.log_message(
56 LogLevel::Error,
57 &format!(
58 "Function or group '{}' not found for spawn\n → at {stacktrace}",
59 name
60 ),
61 );
62
63 Statement {
64 kind: StatementKind::Error {
65 message: format!("Function or group '{}' not found for spawn", name),
66 },
67 value: Value::Null,
68 ..stmt.clone()
69 }
70}
71
72