devalang_core/core/preprocessor/resolver/
synth.rs

1use crate::{
2    core::{
3        parser::statement::{Statement, StatementKind},
4        preprocessor::{module::Module, resolver::driver::resolve_statement},
5        shared::value::Value,
6        store::global::GlobalStore,
7    },
8    utils::logger::{LogLevel, Logger},
9};
10
11pub fn resolve_synth(
12    stmt: &Statement,
13    module: &Module,
14    path: &str,
15    global_store: &mut GlobalStore,
16) -> Statement {
17    let logger = Logger::new();
18
19    let Value::Map(synth_map) = &stmt.value else {
20        return type_error(
21            &logger,
22            module,
23            stmt,
24            "Expected a map in synth statement".to_string(),
25        );
26    };
27
28    let mut resolved_map = synth_map.clone();
29
30    if let Some(Value::Block(body)) = synth_map.get("body") {
31        let resolved_body = body
32            .iter()
33            .map(|s| resolve_statement(s, module, path, global_store))
34            .collect::<Vec<_>>();
35        resolved_map.insert("body".to_string(), Value::Block(resolved_body));
36    } else {
37        logger.log_message(LogLevel::Warning, "synth without a body");
38    }
39
40    Statement {
41        kind: StatementKind::Synth,
42        value: Value::Map(resolved_map),
43        ..stmt.clone()
44    }
45}
46
47fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
48    let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
49    logger.log_error_with_stacktrace(&message, &stacktrace);
50
51    Statement {
52        kind: StatementKind::Error { message },
53        value: Value::Null,
54        ..stmt.clone()
55    }
56}