use serde::{Deserialize, Serialize};
use crate::{
api::{Form, Method, Payload, PayloadError, WriteForm},
types::{
ChatId,
InlineKeyboardMarkup,
InputMedia,
InputMediaData,
InputRichMessage,
InputRichMessageData,
InputText,
InputTextCaption,
Integer,
LinkPreviewOptions,
},
};
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct EphemeralMessageParameters {
receiver_user_id: Integer,
callback_query_id: Option<String>,
replace_callback_query_message: Option<bool>,
}
impl From<Integer> for EphemeralMessageParameters {
fn from(value: Integer) -> Self {
Self {
receiver_user_id: value,
callback_query_id: None,
replace_callback_query_message: None,
}
}
}
impl EphemeralMessageParameters {
pub fn with_callback_query_id<T>(mut self, value: T) -> Self
where
T: Into<String>,
{
self.callback_query_id = Some(value.into());
self
}
pub fn with_replace_callback_query_message(mut self, value: bool) -> Self {
self.replace_callback_query_message = Some(value);
self
}
}
#[derive(Clone, Debug, Serialize)]
pub struct EphemeralMessageIdentity {
chat_id: ChatId,
receiver_user_id: Integer,
ephemeral_message_id: Integer,
}
impl<T> From<(T, Integer, Integer)> for EphemeralMessageIdentity
where
T: Into<ChatId>,
{
fn from((chat_id, receiver_user_id, ephemeral_message_id): (T, Integer, Integer)) -> Self {
Self {
chat_id: chat_id.into(),
receiver_user_id,
ephemeral_message_id,
}
}
}
#[derive(Clone, Debug)]
pub struct DeleteEphemeralMessage {
identity: EphemeralMessageIdentity,
}
impl<T> From<T> for DeleteEphemeralMessage
where
T: Into<EphemeralMessageIdentity>,
{
fn from(value: T) -> Self {
Self { identity: value.into() }
}
}
impl Method for DeleteEphemeralMessage {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("deleteEphemeralMessage", self.identity)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize)]
pub struct EditEphemeralMessageCaption {
#[serde(flatten)]
identity: EphemeralMessageIdentity,
#[serde(flatten)]
caption: Option<InputTextCaption>,
show_caption_above_media: Option<bool>,
reply_markup: Option<InlineKeyboardMarkup>,
}
impl<T> From<T> for EditEphemeralMessageCaption
where
T: Into<EphemeralMessageIdentity>,
{
fn from(value: T) -> Self {
Self {
identity: value.into(),
caption: None,
show_caption_above_media: None,
reply_markup: None,
}
}
}
impl EditEphemeralMessageCaption {
pub fn with_caption<T>(mut self, value: T) -> Self
where
T: Into<InputTextCaption>,
{
self.caption = Some(value.into());
self
}
pub fn with_show_caption_above_media(mut self, value: bool) -> Self {
self.show_caption_above_media = Some(value);
self
}
pub fn with_reply_markup<T>(mut self, value: T) -> Self
where
T: Into<InlineKeyboardMarkup>,
{
self.reply_markup = Some(value.into());
self
}
}
impl Method for EditEphemeralMessageCaption {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("editEphemeralMessageCaption", self)
}
}
#[derive(Debug)]
pub struct EditEphemeralMessageMedia {
identity: EphemeralMessageIdentity,
media: InputMedia,
reply_markup: Option<InlineKeyboardMarkup>,
}
impl EditEphemeralMessageMedia {
pub fn new<A, B>(identity: A, media: B) -> Self
where
A: Into<EphemeralMessageIdentity>,
B: Into<InputMedia>,
{
Self {
identity: identity.into(),
media: media.into(),
reply_markup: None,
}
}
pub fn with_reply_markup<T>(mut self, value: T) -> Self
where
T: Into<InlineKeyboardMarkup>,
{
self.reply_markup = Some(value.into());
self
}
}
#[serde_with::skip_serializing_none]
#[derive(Debug, Serialize)]
struct EditEphemeralMessageMediaParameters {
#[serde(flatten)]
identity: EphemeralMessageIdentity,
media: InputMediaData,
reply_markup: Option<InlineKeyboardMarkup>,
}
impl Method for EditEphemeralMessageMedia {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
let Self {
identity,
media,
reply_markup,
} = self;
let mut form = Form::default();
let parameters = EditEphemeralMessageMediaParameters {
identity,
media: media.write(&mut form),
reply_markup,
};
parameters.serialize(&mut form)?;
Payload::form("editEphemeralMessageMedia", form)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize)]
pub struct EditEphemeralMessageReplyMarkup {
#[serde(flatten)]
identity: EphemeralMessageIdentity,
reply_markup: Option<InlineKeyboardMarkup>,
}
impl<T> From<T> for EditEphemeralMessageReplyMarkup
where
T: Into<EphemeralMessageIdentity>,
{
fn from(value: T) -> Self {
Self {
identity: value.into(),
reply_markup: None,
}
}
}
impl EditEphemeralMessageReplyMarkup {
pub fn with_reply_markup<T>(mut self, value: T) -> Self
where
T: Into<InlineKeyboardMarkup>,
{
self.reply_markup = Some(value.into());
self
}
}
impl Method for EditEphemeralMessageReplyMarkup {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("editEphemeralMessageReplyMarkup", self)
}
}
#[derive(Debug)]
pub struct EditEphemeralMessageText {
identity: EphemeralMessageIdentity,
rich_message: Option<InputRichMessage>,
parameters: EditEphemeralMessageTextParameters,
}
impl EditEphemeralMessageText {
pub fn rich_message<T>(identity: T, rich_message: InputRichMessage) -> Self
where
T: Into<EphemeralMessageIdentity>,
{
Self {
identity: identity.into(),
rich_message: Some(rich_message),
parameters: Default::default(),
}
}
pub fn text<A, B>(identity: A, text: B) -> Self
where
A: Into<EphemeralMessageIdentity>,
B: Into<InputText>,
{
Self {
identity: identity.into(),
rich_message: None,
parameters: EditEphemeralMessageTextParameters {
text: Some(text.into()),
..Default::default()
},
}
}
pub fn with_link_preview_options(mut self, value: LinkPreviewOptions) -> Self {
self.parameters.link_preview_options = Some(value);
self
}
pub fn with_reply_markup<T>(mut self, value: T) -> Self
where
T: Into<InlineKeyboardMarkup>,
{
self.parameters.reply_markup = Some(value.into());
self
}
}
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Serialize)]
struct EditEphemeralMessageTextParameters {
#[serde(flatten)]
identity: Option<EphemeralMessageIdentity>,
#[serde(flatten)]
text: Option<InputText>,
link_preview_options: Option<LinkPreviewOptions>,
reply_markup: Option<InlineKeyboardMarkup>,
rich_message: Option<InputRichMessageData>,
}
impl Method for EditEphemeralMessageText {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
let Self {
identity,
rich_message,
mut parameters,
} = self;
let mut form = Form::default();
parameters.identity = Some(identity);
parameters.rich_message = rich_message.map(|x| x.write(&mut form));
parameters.serialize(&mut form)?;
Payload::form("editEphemeralMessageText", form)
}
}