devalang_wasm/language/preprocessor/resolver/
value.rs

1use crate::language::syntax::ast::Value;
2use std::collections::HashMap;
3
4/// Resolve a value by recursively expanding identifiers from variable tables
5pub fn resolve_value(value: &Value, variables: &HashMap<String, Value>, depth: usize) -> Value {
6    const MAX_DEPTH: usize = 32;
7
8    if depth > MAX_DEPTH {
9        return value.clone();
10    }
11
12    match value {
13        Value::Identifier(name) => {
14            // Delegate dotted resolution to central util (falls back to Null when missing)
15            if name.contains('.') {
16                return crate::utils::props::resolve_dotted_from_table(name, variables);
17            }
18            if let Some(resolved) = variables.get(name) {
19                // Recursively resolve to handle chained identifiers
20                resolve_value(resolved, variables, depth + 1)
21            } else {
22                value.clone()
23            }
24        }
25        Value::Map(map) => {
26            let mut resolved_map = HashMap::new();
27            for (k, v) in map {
28                resolved_map.insert(k.clone(), resolve_value(v, variables, depth + 1));
29            }
30            Value::Map(resolved_map)
31        }
32        Value::Array(arr) => {
33            let resolved: Vec<Value> = arr
34                .iter()
35                .map(|v| resolve_value(v, variables, depth + 1))
36                .collect();
37            Value::Array(resolved)
38        }
39        _ => value.clone(),
40    }
41}
42
43#[cfg(test)]
44#[path = "test_value.rs"]
45mod tests;