devalang_wasm/language/preprocessor/resolver/
value.rs1use crate::language::syntax::ast::Value;
2use std::collections::HashMap;
3
4pub 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 if name.contains('.') {
16 return crate::utils::props::resolve_dotted_from_table(name, variables);
17 }
18 if let Some(resolved) = variables.get(name) {
19 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;