mod friend;
mod group;
pub use friend::FriendSender;
pub use group::GroupSender;
use serde::{Deserialize, Serialize};
use strum::{Display, EnumString, IntoStaticStr};
#[derive(
Debug, Default, Clone, PartialEq, EnumString, Display, IntoStaticStr, Deserialize, Serialize,
)]
pub enum Sex {
#[strum(serialize = "male")]
Male,
#[strum(serialize = "female")]
Female,
#[strum(serialize = "unknow")]
#[default]
Unknown,
}
impl Sex {
pub fn is_male(&self) -> bool {
matches!(self, Sex::Male)
}
pub fn is_female(&self) -> bool {
matches!(self, Sex::Female)
}
pub fn is_unknown(&self) -> bool {
matches!(self, Sex::Unknown)
}
}
#[derive(
Debug, Default, Clone, PartialEq, EnumString, Display, IntoStaticStr, Deserialize, Serialize,
)]
pub enum Role {
#[strum(serialize = "owner")]
Owner,
#[strum(serialize = "admin")]
Admin,
#[strum(serialize = "member")]
Member,
#[strum(serialize = "unknow")]
#[default]
Unknown,
}
impl Role {
pub fn is_owner(&self) -> bool {
matches!(self, Self::Owner)
}
pub fn is_admin(&self) -> bool {
matches!(self, Self::Admin)
}
pub fn is_member(&self) -> bool {
matches!(self, Self::Member)
}
pub fn is_unknown(&self) -> bool {
matches!(self, Self::Unknown)
}
}
pub trait Sender: Send + Sync {
fn user_id(&self) -> &str;
fn name(&self) -> Option<&str>;
fn sex(&self) -> Sex;
fn age(&self) -> Option<u8>;
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "lowercase", tag = "type", content = "field0")]
pub enum SenderType {
Friend(FriendSender),
Group(GroupSender),
}
impl Sender for SenderType {
fn user_id(&self) -> &str {
match self {
SenderType::Friend(sender) => sender.user_id(),
SenderType::Group(sender) => sender.user_id(),
}
}
fn name(&self) -> Option<&str> {
match self {
SenderType::Friend(sender) => sender.name(),
SenderType::Group(sender) => sender.name(),
}
}
fn sex(&self) -> Sex {
match self {
SenderType::Friend(sender) => sender.sex(),
SenderType::Group(sender) => sender.sex(),
}
}
fn age(&self) -> Option<u8> {
match self {
SenderType::Friend(sender) => sender.age(),
SenderType::Group(sender) => sender.age(),
}
}
}