use serde::{Deserialize, Serialize};
use crate::types::{Chat, ChatPeerId, ChatUsername, User, UserPeerId, UserUsername};
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(untagged, from = "RawMessageSender", into = "RawMessageSender")]
pub enum MessageSender {
Chat(Chat),
User(User),
Unknown,
}
impl MessageSender {
pub fn get_user(&self) -> Option<&User> {
match self {
MessageSender::User(user) => Some(user),
_ => None,
}
}
pub fn get_user_id(&self) -> Option<UserPeerId> {
self.get_user().map(|user| user.id)
}
pub fn get_user_username(&self) -> Option<&UserUsername> {
self.get_user().and_then(|user| user.username.as_ref())
}
pub fn get_chat(&self) -> Option<&Chat> {
match self {
MessageSender::Chat(chat) => Some(chat),
_ => None,
}
}
pub fn get_chat_id(&self) -> Option<ChatPeerId> {
self.get_chat().map(|chat| chat.get_id())
}
pub fn get_chat_username(&self) -> Option<&ChatUsername> {
self.get_chat().and_then(|chat| chat.get_username())
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, Serialize)]
struct RawMessageSender {
sender_chat: Option<Chat>,
from: Option<User>,
}
impl From<RawMessageSender> for MessageSender {
fn from(raw: RawMessageSender) -> Self {
match (raw.sender_chat, raw.from) {
(Some(chat), None) => MessageSender::Chat(chat),
(None, Some(user)) => MessageSender::User(user),
_ => MessageSender::Unknown,
}
}
}
impl From<MessageSender> for RawMessageSender {
fn from(value: MessageSender) -> Self {
match value {
MessageSender::Chat(chat) => Self {
sender_chat: Some(chat),
from: None,
},
MessageSender::User(user) => Self {
sender_chat: None,
from: Some(user),
},
MessageSender::Unknown => Self {
sender_chat: None,
from: None,
},
}
}
}