soar_core/database/nests/
repository.rs1use 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}