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    }
52
53    // Otherwise, log an error
54    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// (removed unused helpers get_group_body, error_stmt)