pub mod entities; use rusqlite::ToSql; use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef}; use std::fmt::{Display, Formatter}; use std::num::ParseIntError; use std::str::FromStr; #[derive(Clone, PartialEq, Eq, Debug, Hash, Copy, Ord, PartialOrd, Default)] pub struct Id(pub(crate) u32); pub const INVALID_ID: Id = Id(0); impl FromStr for Id { type Err = ParseIntError; fn from_str(s: &str) -> Result { Ok(Id(s.parse::()?)) } } impl From for Id { fn from(value: u32) -> Self { Id(value) } } impl From for u32 { fn from(value: Id) -> Self { value.0 } } impl Display for Id { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } } impl FromSql for Id { fn column_result(value: ValueRef<'_>) -> FromSqlResult { match value { ValueRef::Integer(i) => Ok(Id(i as u32)), _ => Err(FromSqlError::InvalidType), } } } impl ToSql for Id { fn to_sql(&self) -> rusqlite::Result> { Ok(ToSqlOutput::from(self.0 as i64)) } } impl From for String { fn from(value: Id) -> Self { value.0.to_string() } } impl Id { pub(crate) fn is_valid(self) -> bool { self.0 != 0 } }