devalang_core/core/preprocessor/resolver/
value.rs1use std::collections::HashMap;
2
3use crate::core::{
4 preprocessor::{module::Module, resolver::driver::resolve_statement},
5 shared::value::Value,
6 store::global::GlobalStore,
7};
8
9fn find_export_value(name: &str, global_store: &GlobalStore) -> Option<Value> {
10 for (_path, module) in &global_store.modules {
11 if let Some(val) = module.export_table.get_export(name) {
12 return Some(val.clone());
13 }
14 }
15
16 None
17}
18
19pub fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
20 match value {
21 Value::String(s) => {
22 Value::String(s.clone())
24 }
25
26 Value::Identifier(name) => {
27 if let Some(original_val) = module.variable_table.get(name) {
28 return resolve_value(original_val, module, global_store);
29 }
30
31 if let Some(export_val) = find_export_value(name, global_store) {
32 return resolve_value(&export_val, module, global_store);
33 }
34
35 Value::Identifier(name.clone())
37 }
38
39 Value::Map(map) => {
40 if let Some(Value::Identifier(entity)) = map.get("entity") {
41 if entity == "synth" {
43 if let Some(Value::Map(synth_data)) = map.get("value") {
44 let resolved_waveform = synth_data
45 .get("waveform")
46 .map(|wf| resolve_value(wf, module, global_store))
47 .unwrap_or(Value::Null);
48
49 let resolved_params = synth_data
50 .get("parameters")
51 .map(|p| resolve_value(p, module, global_store))
52 .unwrap_or(Value::Map(HashMap::new()));
53
54 let mut result = HashMap::new();
55 result.insert("waveform".to_string(), resolved_waveform);
56 result.insert("parameters".to_string(), resolved_params);
57
58 return Value::Map(result);
59 }
60 }
61 }
62
63 let mut resolved = HashMap::new();
64 for (k, v) in map {
65 resolved.insert(k.clone(), resolve_value(v, module, global_store));
66 }
67
68 Value::Map(resolved)
69 }
70
71 Value::Block(stmts) => {
72 let resolved_stmts = stmts
73 .iter()
74 .map(|stmt| resolve_statement(stmt, module, &module.path, global_store))
75 .collect();
76 Value::Block(resolved_stmts)
77 }
78
79 other => other.clone(),
80 }
81}