use super::{Role, Sender, Sex};
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct GroupSender {
pub user_id: String,
pub nick: Option<String>,
pub sex: Sex,
pub age: Option<u8>,
pub role: Role,
pub card: Option<String>,
pub level: Option<u8>,
pub title: Option<String>,
}
impl GroupSender {
pub fn role(&self) -> Role {
self.role.clone()
}
pub fn card(&self) -> Option<&str> {
self.card.as_deref()
}
pub fn level(&self) -> Option<u8> {
self.level
}
pub fn title(&self) -> Option<&str> {
self.title.as_deref()
}
}
impl Sender for GroupSender {
fn user_id(&self) -> &str {
self.user_id.as_str()
}
fn name(&self) -> Option<&str> {
self.nick.as_deref()
}
fn sex(&self) -> Sex {
self.sex.clone()
}
fn age(&self) -> Option<u8> {
self.age
}
}
#[cfg(feature = "sender")]
#[macro_export]
macro_rules! group_sender {
( $( $key:ident : $value:expr ),* $(,)? ) => {{
let mut sender = $crate::sender::GroupSender::default();
$(
sender.$key = group_sender!(@convert $key, $value);
)*
sender
}};
(@convert user_id, $v:expr) => { $v.to_string() };
(@convert nick, None) => { None };
(@convert nick, $v:expr) => { Some($v.to_string()) };
(@convert sex, $v:expr) => { $v };
(@convert age, $v:expr) => { Some($v) };
(@convert role, $v:expr) => { $v };
(@convert card, $v:expr) => { Some($v.to_string()) };
(@convert level, $v:expr) => { Some($v) };
(@convert title, $v:expr) => { Some($v.to_string()) };
}