#[cfg(feature = "derive")]
pub use fav_derive::Attr;
#[allow(missing_docs)]
#[derive(Debug)]
pub enum Id<'a> {
I64(i64),
I32(i32),
String(&'a str),
}
impl PartialEq for Id<'_> {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Id::I64(a), Id::I64(b)) => a == b,
(Id::I32(a), Id::I32(b)) => a == b,
(Id::I64(a), Id::I32(b)) => *a == *b as i64,
(Id::I32(a), Id::I64(b)) => *a as i64 == *b,
(Id::String(a), Id::String(b)) => a == b,
_ => false,
}
}
}
pub trait Attr {
fn id(&self) -> Id;
fn title(&self) -> &str;
}
pub trait Count {
fn count(&self) -> i32;
}
impl From<i64> for Id<'_> {
fn from(id: i64) -> Self {
Id::I64(id)
}
}
impl From<i32> for Id<'_> {
fn from(id: i32) -> Self {
Id::I32(id)
}
}
impl From<&i64> for Id<'_> {
fn from(id: &i64) -> Self {
Id::I64(*id)
}
}
impl From<&i32> for Id<'_> {
fn from(id: &i32) -> Self {
Id::I32(*id)
}
}
impl<'a> From<&'a str> for Id<'a> {
fn from(id: &'a str) -> Self {
match id.parse::<i32>() {
Ok(id) => Id::I32(id),
Err(_) => match id.parse::<i64>() {
Ok(id) => Id::I64(id),
Err(_) => Id::String(id),
},
}
}
}
impl<'a> From<&'a String> for Id<'a> {
fn from(id: &'a String) -> Self {
id.as_str().into()
}
}
impl From<Id<'_>> for i32 {
fn from(value: Id) -> Self {
match value {
Id::I32(id) => id,
_ => panic!("Not i32 id"),
}
}
}
impl From<Id<'_>> for i64 {
fn from(value: Id) -> Self {
match value {
Id::I64(id) => id,
_ => panic!("Not i64 id"),
}
}
}
impl From<Id<'_>> for String {
fn from(value: Id) -> Self {
match value {
Id::String(id) => id.to_owned(),
Id::I64(id) => id.to_string(),
Id::I32(id) => id.to_string(),
}
}
}