devalang_core/core/preprocessor/resolver/
pattern.rs1use 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_pattern(
10 stmt: &Statement,
11 module: &Module,
12 path: &str,
13 global_store: &mut GlobalStore,
14) -> Statement {
15 let logger = Logger::new();
16
17 if let StatementKind::Pattern { name, target } = &stmt.kind {
19 if global_store.variables.variables.contains_key(name) {
21 logger.log_error_with_stacktrace(&format!("Pattern identifier '{}' already exists", name), path);
22 return Statement {
23 kind: StatementKind::Error { message: format!("Pattern '{}' already exists", name) },
24 ..stmt.clone()
25 };
26 }
27
28 let resolved_value = resolve_value(&stmt.value, module, global_store);
30
31 let mut map = std::collections::HashMap::new();
33 map.insert("identifier".to_string(), Value::String(name.clone()));
34 if let Some(t) = target {
35 map.insert("target".to_string(), Value::String(t.clone()));
36 }
37 map.insert("pattern".to_string(), resolved_value.clone());
39
40 let resolved_stmt = Statement {
41 kind: StatementKind::Pattern {
42 name: name.clone(),
43 target: target.clone(),
44 },
45 value: resolved_value,
46 ..stmt.clone()
47 };
48
49 global_store.variables.variables.insert(
51 name.clone(),
52 Value::Statement(Box::new(resolved_stmt.clone())),
53 );
54
55 return resolved_stmt;
56 }
57
58 logger.log_message(LogLevel::Warning, "resolve_pattern called on non-pattern statement");
59 stmt.clone()
60}
61
62fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
63 match value {
65 Value::String(s) => Value::String(s.clone()),
66 Value::Map(m) => {
67 let mut resolved = std::collections::HashMap::new();
68 for (k, v) in m {
69 resolved.insert(k.clone(), resolve_value(v, module, global_store));
70 }
71 Value::Map(resolved)
72 }
73 other => other.clone(),
74 }
75}