use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Chat {
Private(crate::types::ChatPrivate),
Group(crate::types::ChatGroup),
Supergroup(crate::types::ChatSupergroup),
Channel(crate::types::ChatChannel),
}
impl Chat {
#[must_use]
pub fn first_name(&self) -> Option<&str> {
match self {
Self::Private(val) => val.first_name.as_deref(),
_ => None,
}
}
#[must_use]
pub fn id(&self) -> i64 {
match self {
Self::Private(val) => val.id,
Self::Group(val) => val.id,
Self::Supergroup(val) => val.id,
Self::Channel(val) => val.id,
}
}
#[must_use]
pub fn is_direct_messages(&self) -> Option<bool> {
match self {
Self::Private(val) => val.is_direct_messages,
Self::Group(val) => val.is_direct_messages,
Self::Supergroup(val) => val.is_direct_messages,
Self::Channel(val) => val.is_direct_messages,
}
}
#[must_use]
pub fn is_forum(&self) -> Option<bool> {
match self {
Self::Supergroup(val) => val.is_forum,
_ => None,
}
}
#[must_use]
pub fn last_name(&self) -> Option<&str> {
match self {
Self::Private(val) => val.last_name.as_deref(),
_ => None,
}
}
#[must_use]
pub fn title(&self) -> Option<&str> {
match self {
Self::Supergroup(val) => val.title.as_deref(),
Self::Channel(val) => val.title.as_deref(),
_ => None,
}
}
#[must_use]
pub fn username(&self) -> Option<&str> {
match self {
Self::Private(val) => val.username.as_deref(),
Self::Supergroup(val) => val.username.as_deref(),
Self::Channel(val) => val.username.as_deref(),
Self::Group(_) => None,
}
}
}
impl From<crate::types::ChatPrivate> for Chat {
fn from(val: crate::types::ChatPrivate) -> Self {
Self::Private(val)
}
}
impl TryFrom<Chat> for crate::types::ChatPrivate {
type Error = crate::errors::ConvertToTypeError;
fn try_from(val: Chat) -> Result<Self, Self::Error> {
if let Chat::Private(inner) = val {
Ok(inner)
} else {
Err(Self::Error::new(stringify!(Chat), stringify!(ChatPrivate)))
}
}
}
impl From<crate::types::ChatGroup> for Chat {
fn from(val: crate::types::ChatGroup) -> Self {
Self::Group(val)
}
}
impl TryFrom<Chat> for crate::types::ChatGroup {
type Error = crate::errors::ConvertToTypeError;
fn try_from(val: Chat) -> Result<Self, Self::Error> {
if let Chat::Group(inner) = val {
Ok(inner)
} else {
Err(Self::Error::new(stringify!(Chat), stringify!(ChatGroup)))
}
}
}
impl From<crate::types::ChatSupergroup> for Chat {
fn from(val: crate::types::ChatSupergroup) -> Self {
Self::Supergroup(val)
}
}
impl TryFrom<Chat> for crate::types::ChatSupergroup {
type Error = crate::errors::ConvertToTypeError;
fn try_from(val: Chat) -> Result<Self, Self::Error> {
if let Chat::Supergroup(inner) = val {
Ok(inner)
} else {
Err(Self::Error::new(
stringify!(Chat),
stringify!(ChatSupergroup),
))
}
}
}
impl From<crate::types::ChatChannel> for Chat {
fn from(val: crate::types::ChatChannel) -> Self {
Self::Channel(val)
}
}
impl TryFrom<Chat> for crate::types::ChatChannel {
type Error = crate::errors::ConvertToTypeError;
fn try_from(val: Chat) -> Result<Self, Self::Error> {
if let Chat::Channel(inner) = val {
Ok(inner)
} else {
Err(Self::Error::new(stringify!(Chat), stringify!(ChatChannel)))
}
}
}