rustvello_sqlite/trigger/
mod.rs1mod 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
15pub 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
36fn 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
49fn 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}