use std::cell::RefCell;
use std::collections::HashMap;
#[derive(Clone, Debug, serde::Serialize)]
pub struct RegisteredBank {
pub full_name: String,
pub alias: String,
pub triggers: HashMap<String, String>,
}
thread_local! {
pub static REGISTERED_BANKS: RefCell<Vec<RegisteredBank>> = RefCell::new(Vec::new());
}
pub fn register_bank(full_name: String, alias: String, triggers: HashMap<String, String>) {
REGISTERED_BANKS.with(|banks| {
banks.borrow_mut().push(RegisteredBank {
full_name,
alias,
triggers,
});
});
}
pub fn clear_banks() {
REGISTERED_BANKS.with(|banks| {
banks.borrow_mut().clear();
});
}
pub fn list_banks() -> Vec<RegisteredBank> {
REGISTERED_BANKS.with(|banks| banks.borrow().clone())
}
pub fn inject_registered_banks(
interpreter: &mut crate::engine::audio::interpreter::AudioInterpreter,
) {
use crate::language::syntax::ast::Value;
REGISTERED_BANKS.with(|banks| {
for bank in banks.borrow().iter() {
let mut trigger_map = HashMap::new();
for (trigger_name, uri) in &bank.triggers {
trigger_map.insert(trigger_name.clone(), Value::String(uri.clone()));
trigger_map.insert(format!("{}_url", trigger_name), Value::String(uri.clone()));
}
crate::utils::props::ensure_default_properties(&mut trigger_map, Some("trigger"));
interpreter
.variables
.insert(bank.alias.clone(), Value::Map(trigger_map));
}
});
}
pub fn inject_banks_into_globals(
variables: &mut HashMap<String, crate::language::syntax::ast::Value>,
) {
use crate::language::syntax::ast::Value;
REGISTERED_BANKS.with(|banks| {
for bank in banks.borrow().iter() {
let mut trigger_map = HashMap::new();
for (trigger_name, path) in &bank.triggers {
trigger_map.insert(trigger_name.clone(), Value::String(path.clone()));
let deva_uri = format!("devalang://bank/{}/{}", bank.full_name, path);
trigger_map.insert(format!("{}_deva", trigger_name), Value::String(deva_uri));
}
crate::utils::props::ensure_default_properties(&mut trigger_map, Some("trigger"));
variables.insert(bank.alias.clone(), Value::Map(trigger_map));
for (trigger_name, path) in &bank.triggers {
let var_name = format!("{}.{}", bank.alias, trigger_name);
variables.insert(var_name, Value::String(path.clone()));
}
}
});
}