use std::sync::OnceLock;
use regex::Regex;
use super::regex_case_insensitive;
use crate::schema::table::EventDefinition;
fn when_regex() -> &'static Regex {
static RE: OnceLock<Regex> = OnceLock::new();
RE.get_or_init(|| regex_case_insensitive(r"(?s)WHEN\s+(.+?)\s+THEN"))
}
fn then_regex() -> &'static Regex {
static RE: OnceLock<Regex> = OnceLock::new();
RE.get_or_init(|| regex_case_insensitive(r"(?s)THEN\s+(?:\{(.+?)\}|(.+?))(?:\s*;|\s*$)"))
}
pub fn parse_events(ev: &std::collections::BTreeMap<String, String>) -> Vec<EventDefinition> {
ev.iter()
.filter_map(|(name, def)| parse_event(name, def))
.collect()
}
pub fn parse_event(name: &str, definition: &str) -> Option<EventDefinition> {
if definition.is_empty() {
return None;
}
let condition = extract_event_condition(definition)?;
let action = extract_event_action(definition)?;
Some(EventDefinition {
name: name.to_string(),
condition,
action,
})
}
fn extract_event_condition(definition: &str) -> Option<String> {
when_regex()
.captures(definition)
.and_then(|c| c.get(1))
.map(|m| m.as_str().trim().to_string())
}
fn extract_event_action(definition: &str) -> Option<String> {
let caps = then_regex().captures(definition)?;
if let Some(m) = caps.get(1) {
return Some(m.as_str().trim().to_string());
}
caps.get(2).map(|m| m.as_str().trim().to_string())
}