Skip to main content

rustvello_sqlite/trigger/
mod.rs

1//! SQLite trigger store implementation.
2
3mod store;
4
5#[cfg(test)]
6mod tests;
7
8use std::sync::Arc;
9
10use rustvello_core::error::{RustvelloError, RustvelloResult};
11use rustvello_proto::trigger::{ConditionId, TriggerCondition, TriggerLogic};
12
13use crate::db::{sql_err, Database};
14
15/// SQLite-backed trigger store implementation.
16pub struct SqliteTriggerStore {
17    db: Arc<Database>,
18}
19
20impl SqliteTriggerStore {
21    pub fn new(db: Arc<Database>) -> Self {
22        Self { db }
23    }
24}
25
26fn parse_logic(s: &str) -> RustvelloResult<TriggerLogic> {
27    match s {
28        "OR" => Ok(TriggerLogic::Or),
29        "AND" => Ok(TriggerLogic::And),
30        other => Err(RustvelloError::state_backend(format!(
31            "unknown trigger logic in database: {other:?}"
32        ))),
33    }
34}
35
36/// Return the discriminant tag for a condition variant.
37fn condition_type_tag(condition: &TriggerCondition) -> &'static str {
38    match condition {
39        TriggerCondition::Cron(_) => "Cron",
40        TriggerCondition::Status(_) => "Status",
41        TriggerCondition::Event(_) => "Event",
42        TriggerCondition::Result(_) => "Result",
43        TriggerCondition::Exception(_) => "Exception",
44        TriggerCondition::Composite(_) => "Composite",
45        _ => "Unknown",
46    }
47}
48
49/// Get condition IDs associated with a trigger.
50fn get_condition_ids_for_trigger(
51    conn: &rusqlite::Connection,
52    trigger_id: &str,
53) -> RustvelloResult<Vec<ConditionId>> {
54    let mut stmt = conn
55        .prepare("SELECT condition_id FROM trg_condition_triggers WHERE trigger_id = ?1")
56        .map_err(sql_err)?;
57    let ids: Vec<String> = stmt
58        .query_map(rusqlite::params![trigger_id], |row| row.get(0))
59        .map_err(sql_err)?
60        .collect::<Result<Vec<_>, _>>()
61        .map_err(sql_err)?;
62    Ok(ids.into_iter().map(ConditionId::from).collect())
63}