use crate::schema::{category}; use crate::schema::category::dsl::*; use super::*; #[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] #[table_name="category"] pub struct Category { pub id: i32, pub name: String } #[derive(Insertable, AsChangeset, Clone, Serialize, Deserialize)] #[table_name="category"] pub struct CategoryForm { pub name: String, } impl Crud for Category { fn read(conn: &PgConnection, category_id: i32) -> Result { category.find(category_id) .first::(conn) } fn delete(conn: &PgConnection, category_id: i32) -> Result { diesel::delete(category.find(category_id)) .execute(conn) } fn create(conn: &PgConnection, new_category: &CategoryForm) -> Result { insert_into(category) .values(new_category) .get_result::(conn) } fn update(conn: &PgConnection, category_id: i32, new_category: &CategoryForm) -> Result { diesel::update(category.find(category_id)) .set(new_category) .get_result::(conn) } } impl Category { pub fn list_all(conn: &PgConnection) -> Result, Error> { category.load::(conn) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_crud() { let conn = establish_connection(); let categories = Category::list_all(&conn).unwrap(); let expected_first_category = Category { id: 1, name: "Discussion".into() }; assert_eq!(expected_first_category, categories[0]); } }