use std::fmt; use diesel::expression::AsExpression; use diesel::prelude::*; use diesel::sql_types::Text; #[derive(AsExpression, Debug, Clone)] #[diesel(sql_type = Text)] pub enum ProjectRole { Member, Admin, } impl fmt::Display for ProjectRole { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { ProjectRole::Member => write!(f, "member"), ProjectRole::Admin => write!(f, "admin"), } } } impl From for ProjectRole where S: AsRef, String: std::convert::From, { fn from(status: S) -> Self { match status.as_ref() { "member" => ProjectRole::Member, "admin" => ProjectRole::Admin, _ => ProjectRole::Member, } } } impl From for String { fn from(role: ProjectRole) -> Self { match role { ProjectRole::Member => "member".to_string(), ProjectRole::Admin => "admin".to_string(), } } } #[derive(Queryable, Selectable, Debug, Clone)] #[diesel(table_name = crate::schema::project_memberships)] #[diesel(check_for_backend(diesel::sqlite::Sqlite))] pub struct ProjectMembership { pub id: i32, pub user_id: String, pub project_id: String, #[diesel(serialize_as = String, deserialize_as = String)] pub role: ProjectRole, } #[derive(Insertable)] #[diesel(table_name = crate::schema::project_memberships)] pub struct NewProjectMembership { pub user_id: String, pub project_id: String, #[diesel(serialize_as = String, deserialize_as = String)] pub role: ProjectRole, } pub mod q { use diesel::SqliteConnection; use super::*; pub fn create( conn: &mut SqliteConnection, user_id: &str, project_id: &str, role: ProjectRole, ) -> Result { use crate::schema::project_memberships::dsl as pm; let new_membership = NewProjectMembership { user_id: user_id.to_string(), project_id: project_id.to_string(), role, }; let membership = diesel::insert_into(pm::project_memberships).values(new_membership).get_result(conn)?; Ok(membership) } }