use serde::{Deserialize,Serialize,Deserializer}; //use sqlx::{sqlite::SqlitePool, Row, Sqlite}; // use sqlx::{ // FromRow, // decode::Decode, // any::{AnyRow, AnyValueRef}, // database::{ // Database, // HasValueRef, // }, // Row, // // Error, // }; // use std::error::Error; // use std::str::FromStr; //use super::User; // #[derive(sqlx::FromRow)][derive(sqlx::Type)] //#[derive(sqlx::Type)] //#[sqlx(type_name = "userstatus_type")] // #[derive(sqlx::FromRow)] //#[sqlx(display_fromstr)] #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize)] pub enum UserStatus { Created, Active, Pending, Lock, Unknown, } impl UserStatus { #[allow(dead_code)] pub fn from_str(status: &str) -> Self { match status { "created"|"Created" => UserStatus::Created, "active"|"Active" => UserStatus::Active, "pending"|"Pending" => UserStatus::Pending, "lock"|"Lock" => UserStatus::Lock, _ => UserStatus::Unknown, } } } impl std::fmt::Display for UserStatus { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { UserStatus::Created => write!(f,"Created"), UserStatus::Active => write!(f,"Active"), UserStatus::Pending => write!(f,"Pending"), UserStatus::Lock => write!(f,"Lock"), UserStatus::Unknown => write!(f,"Unknown"), } } } impl Default for UserStatus { fn default() -> Self { UserStatus::Unknown } } #[allow(dead_code)] pub fn deserialize_user_status<'de, D>(deserializer: D) -> Result where D: Deserializer<'de> { let buf = String::deserialize(deserializer)?; Ok(UserStatus::from_str(&buf)) } // impl sqlx::Type for UserStatus { // fn type_info() -> sqlx::any::AnyTypeInfo { // //let res: sqlx::any::AnyTypeInfo = String::type_info(); // let res = >::type_info(); // // let res = sqlx::any::AnyTypeInfo::default(); // String::type_info(); // res // // String::type_info() // } // // fn compatible(ty: &::AnyTypeInfo) -> bool { // // *ty == Self::type_info() // // } // } /* impl sqlx::Type for UserStatus { fn type_info() -> sqlx::sqlite::SqliteTypeInfo { let t = String::type_info(); t } } impl sqlx::Type for UserStatus { fn type_info() -> sqlx::mssql::MssqlTypeInfo { String::type_info() } } impl sqlx::Type for UserStatus { fn type_info() -> sqlx::mysql::MySqlTypeInfo { String::type_info() } } impl sqlx::Type for UserStatus { fn type_info() -> sqlx::postgres::PgTypeInfo { String::type_info() } } impl<'q> sqlx::Encode<'q, sqlx::Any> for UserStatus { fn encode_by_ref( &self, args: &mut sqlx::any::AnyArgumentBuffer<'q>, ) -> sqlx::encode::IsNull { self.encode_by_ref(args) } } */ /* impl<'r> sqlx::Decode<'r, sqlx::Any> for UserStatus { fn decode( // value: >::AnyValueRef, value: sqlx::any::AnyValueRef<'r>, ) -> Result { //let string = value. try_decode()?; //let string = <&str as Decode>::decode(value)?; let v = value.to_owned(); let string = value.parse()?; let value = UserStatus::from_str(&string); Ok(value) } } impl<'r, DB: Database> Decode<'r, DB> for UserStatus where // we want to delegate some of the work to string decoding so let's make sure strings // are supported by the database &'r str: Decode<'r, DB> { fn decode( value: >::ValueRef, ) -> Result> { // the interface of ValueRef is largely unstable at the moment // so this is not directly implementable // however, you can delegate to a type that matches the format of the type you want // to decode (such as a UTF-8 string) let val = <&str as Decode>::decode(value)?; // now you can parse this into your type (assuming there is a `FromStr`) //Ok(value.parse()?) Ok(UserStatus::from_str(&val)) } } */ /* impl<'r> Decode<'r, sqlx::Any> for UserStatus { fn decode( value: sqlx::any::AnyValueRef<'r>, ) -> Result { //let mut decoder = ::new(value)?; //let string = decoder.try_decode::()?; //let username = decoder.try_decode::()?; //let photo = decoder.try_decode::>()?; let string = <&str as Decode>::decode(value)?; let value = UserStatus::from_str(&string); Ok(value) } } impl<'r> Decode<'r, sqlx::Sqlite> for UserStatus { fn decode( value: sqlx::sqlite::SqliteValueRef<'r>, ) -> Result { let string = <&str as Decode>::decode(value)?; let value = UserStatus::from_str(string); Ok(value) } } // impl<'r> Decode<'r, sqlx::Mssql> for UserStatus { // fn decode( // value: sqlx::mssql::MssqlValueRef<'r>, // ) -> Result> { // //) -> Result { // let string = <&str as Decode>::decode(value)?; // let value = UserStatus::from_str(string); // Ok(value) // } // } impl<'r> Decode<'r, sqlx::MySql> for UserStatus { fn decode( value: sqlx::mysql::MySqlValueRef<'r>, ) -> Result { let string = <&str as Decode>::decode(value)?; let value = UserStatus::from_str(string); Ok(value) } } impl<'r> Decode<'r, sqlx::Postgres> for UserStatus { fn decode( value: sqlx::postgres::PgValueRef<'r>, ) -> Result { //let mut decoder = sqlx::postgres::types::PgRecordDecoder::new(value)?; ////let username = decoder.try_decode::()?; //let string = decoder.try_decode::()?; let string = <&str as Decode>::decode(value)?; let value = UserStatus::from_str(string); Ok(value) } } impl FromRow<'_, AnyRow> for UserStatus { fn from_row(row: &AnyRow) -> sqlx::Result { let v: String = row.try_get("status")?; Ok( UserStatus::from_str(&v) ) } } impl FromStr for UserStatus { type Err = (); fn from_str(s: &str) -> Result { Ok(UserStatus::from_str(s)) } } */