soar_core/database/nests/
repository.rs

1use rusqlite::{params, Result};
2
3use crate::{database::models::FromRow, error::SoarError, SoarResult};
4
5use super::models::Nest;
6
7pub fn add(tx: &rusqlite::Transaction, nest: &Nest) -> Result<()> {
8    tx.execute(
9        "INSERT INTO nests (name, url) VALUES (?1, ?2)",
10        params![nest.name, nest.url],
11    )?;
12    Ok(())
13}
14
15pub fn list(tx: &rusqlite::Transaction) -> Result<Vec<Nest>> {
16    let mut stmt = tx.prepare("SELECT id, name, url FROM nests")?;
17    let nests = stmt
18        .query_map([], Nest::from_row)?
19        .filter_map(|n| match n {
20            Ok(nest) => Some(nest),
21            Err(err) => {
22                eprintln!("Nest map error: {err:#?}");
23                None
24            }
25        })
26        .collect();
27    Ok(nests)
28}
29
30pub fn remove(tx: &rusqlite::Transaction, name: &str) -> SoarResult<()> {
31    let full_name = format!("nest-{name}");
32    let result = tx.execute("DELETE FROM nests WHERE name = ?1", params![full_name])?;
33    if result == 0 {
34        return Err(SoarError::Custom(format!(
35            "No nest found with name `{name}`",
36        )));
37    }
38    Ok(())
39}