use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ValueRef}; use std::fmt; #[derive(Debug, serde::Serialize)] pub struct Report { pub date: String, pub name: String, pub amount: i64, pub action: Action, } #[derive(Debug, PartialEq, serde::Serialize)] pub enum Action { Created, Updated, Deleted, } impl fmt::Display for Action { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self) } } impl FromSql for Action { fn column_result(value: ValueRef<'_>) -> FromSqlResult { match value { ValueRef::Text(text) => match std::str::from_utf8(text) { Ok("Created") => Ok(Action::Created), Ok("Updated") => Ok(Action::Updated), Ok("Deleted") => Ok(Action::Deleted), Ok(str) => Err(FromSqlError::Other( format!("Unknown action: {str}").into(), )), Err(err) => Err(FromSqlError::Other(err.into())), }, _ => Err(FromSqlError::InvalidType), } } }