devalang_core/core/preprocessor/resolver/
spawn.rs

1use 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 it's a function
20    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 it's a group stored in variables
34    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        // Pattern case (make spawn accept patterns stored as variables)
52        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            // pattern value may be a string or a map stored on the statement
56            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    // Otherwise, log an error
81    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// (removed unused helpers get_group_body, error_stmt)