use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::{
api::{Method, Payload, PayloadError},
types::{Chat, ChatId, Integer, User},
};
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct ChatBoost {
pub add_date: Integer,
pub boost_id: String,
pub expiration_date: Integer,
pub source: ChatBoostSource,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct ChatBoostRemoved {
pub boost_id: String,
pub chat: Chat,
pub remove_date: Integer,
pub source: ChatBoostSource,
}
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
#[serde(rename_all = "snake_case", tag = "source")]
pub enum ChatBoostSource {
#[serde(
deserialize_with = "ChatBoostSourceUser::deserialize_value",
serialize_with = "ChatBoostSourceUser::serialize_value"
)]
GiftCode(User),
Giveaway(ChatBoostSourceGiveaway),
#[serde(
deserialize_with = "ChatBoostSourceUser::deserialize_value",
serialize_with = "ChatBoostSourceUser::serialize_value"
)]
Premium(User),
}
#[derive(Deserialize, Serialize)]
struct ChatBoostSourceUser {
user: User,
}
impl ChatBoostSourceUser {
pub(super) fn deserialize_value<'de, D>(deserializer: D) -> Result<User, D::Error>
where
D: Deserializer<'de>,
{
Self::deserialize(deserializer).map(|x| x.user)
}
pub(super) fn serialize_value<S>(value: &User, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
Self { user: value.clone() }.serialize(serializer)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct ChatBoostSourceGiveaway {
pub giveaway_message_id: Integer,
pub is_unclaimed: Option<bool>,
pub prize_star_count: Option<Integer>,
pub user: Option<User>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct ChatBoostUpdated {
pub boost: ChatBoost,
pub chat: Chat,
}
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct UserChatBoosts {
pub boosts: Vec<ChatBoost>,
}
#[derive(Clone, Debug, Serialize)]
pub struct GetUserChatBoosts {
chat_id: ChatId,
user_id: Integer,
}
impl GetUserChatBoosts {
pub fn new<T>(chat_id: T, user_id: Integer) -> Self
where
T: Into<ChatId>,
{
Self {
chat_id: chat_id.into(),
user_id,
}
}
}
impl Method for GetUserChatBoosts {
type Response = UserChatBoosts;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("getUserChatBoosts", self)
}
}