use anyhow::{Context, Result}; use diesel::{QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; use schist_models::category::Category; use schist_schema::schema::categories::{self as categories_schema, dsl::categories as categories_table}; pub fn delete_all_categories(connection: &mut SqliteConnection) -> Result { let num_rows_deleted = diesel::delete(categories_table) .execute(connection) .with_context(|| "failed to delete all categories")?; Ok(num_rows_deleted) } pub fn get_all_categories(connection: &mut SqliteConnection) -> Result> { let all_categories = categories_table .select(Category::as_select()) .load(connection) .with_context(|| "failed to get all categories")?; Ok(all_categories) } pub fn get_all_category_ids(connection: &mut SqliteConnection) -> Result> { let all_category_ids = categories_table .select(categories_schema::id) .load(connection) .with_context(|| "failed to get all category IDs")?; Ok(all_category_ids) } pub fn insert_categories( categories: &[Category], connection: &mut SqliteConnection, ) -> Result { let num_categories_inserted = diesel::insert_into(categories_table) .values(categories) .execute(connection) .with_context(|| insert_err_msg(categories))?; Ok(num_categories_inserted) } fn insert_err_msg(categories: &[Category]) -> String { format!( "failed to insert categories: [{}]", categories .iter() .map(|c| format!("\"{}\": \"{}\"", c.id, c.name)) .collect::>() .join(", ") ) }