use serde::{Deserialize, Serialize};
use crate::{
api::{Form, Method, Payload, PayloadError, WriteForm},
types::{InputFile, InputSticker, InputStickerData, Integer, PhotoSize, Sticker, StickerFormat, StickerType},
};
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct StickerSet {
pub name: String,
pub sticker_type: StickerType,
pub stickers: Vec<Sticker>,
pub title: String,
pub thumbnail: Option<PhotoSize>,
}
#[derive(Debug)]
pub struct AddStickerToSet {
sticker: InputSticker,
parameters: AddStickerToSetParameters,
}
impl AddStickerToSet {
pub fn new<T>(user_id: Integer, name: T, sticker: InputSticker) -> Self
where
T: Into<String>,
{
Self {
sticker,
parameters: AddStickerToSetParameters {
user_id: Some(user_id),
name: Some(name.into()),
..Default::default()
},
}
}
}
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Serialize)]
struct AddStickerToSetParameters {
name: Option<String>,
sticker: Option<InputStickerData>,
user_id: Option<Integer>,
}
impl Method for AddStickerToSet {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
let Self {
sticker,
mut parameters,
} = self;
let mut form = Form::default();
parameters.sticker = Some(sticker.write(&mut form));
parameters.serialize(&mut form)?;
Payload::form("addStickerToSet", form)
}
}
#[derive(Debug)]
pub struct CreateNewStickerSet {
stickers: Vec<InputSticker>,
parameters: CreateNewStickerSetParameters,
}
impl CreateNewStickerSet {
pub fn new<A, B, C>(user_id: Integer, name: A, title: B, stickers: C) -> Self
where
A: Into<String>,
B: Into<String>,
C: IntoIterator<Item = InputSticker>,
{
Self {
stickers: Vec::from_iter(stickers),
parameters: CreateNewStickerSetParameters {
user_id: Some(user_id),
name: Some(name.into()),
title: Some(title.into()),
..Default::default()
},
}
}
pub fn with_needs_repainting(mut self, value: bool) -> Self {
self.parameters.needs_repainting = Some(value);
self
}
pub fn with_sticker_type(mut self, value: StickerType) -> Self {
self.parameters.sticker_type = Some(value);
self
}
}
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Serialize)]
struct CreateNewStickerSetParameters {
name: Option<String>,
needs_repainting: Option<bool>,
sticker_type: Option<StickerType>,
stickers: Option<Vec<InputStickerData>>,
title: Option<String>,
user_id: Option<Integer>,
}
impl Method for CreateNewStickerSet {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
let Self {
stickers,
mut parameters,
} = self;
let mut form = Form::default();
parameters.stickers = Some(stickers.into_iter().map(|x| x.write(&mut form)).collect());
parameters.serialize(&mut form)?;
Payload::form("createNewStickerSet", form)
}
}
#[derive(Clone, Debug, Serialize)]
pub struct DeleteStickerFromSet {
sticker: String,
}
impl DeleteStickerFromSet {
pub fn new<T>(sticker: T) -> Self
where
T: Into<String>,
{
Self {
sticker: sticker.into(),
}
}
}
impl Method for DeleteStickerFromSet {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("deleteStickerFromSet", self)
}
}
#[derive(Clone, Debug, Serialize)]
pub struct DeleteStickerSet {
name: String,
}
impl DeleteStickerSet {
pub fn new<T>(name: T) -> Self
where
T: Into<String>,
{
Self { name: name.into() }
}
}
impl Method for DeleteStickerSet {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("deleteStickerSet", self)
}
}
#[derive(Clone, Debug, Serialize)]
pub struct GetStickerSet {
name: String,
}
impl GetStickerSet {
pub fn new<T>(name: T) -> Self
where
T: Into<String>,
{
Self { name: name.into() }
}
}
impl Method for GetStickerSet {
type Response = StickerSet;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("getStickerSet", self)
}
}
#[derive(Debug)]
pub struct ReplaceStickerInSet {
sticker: InputSticker,
parameters: ReplaceStickerInSetParameters,
}
impl ReplaceStickerInSet {
pub fn new<A, B>(name: A, old_sticker: B, sticker: InputSticker, user_id: Integer) -> Self
where
A: Into<String>,
B: Into<String>,
{
Self {
sticker,
parameters: ReplaceStickerInSetParameters {
name: Some(name.into()),
old_sticker: Some(old_sticker.into()),
user_id: Some(user_id),
..Default::default()
},
}
}
}
#[derive(Debug, Default, Serialize)]
struct ReplaceStickerInSetParameters {
name: Option<String>,
old_sticker: Option<String>,
sticker: Option<InputStickerData>,
user_id: Option<Integer>,
}
impl Method for ReplaceStickerInSet {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
let Self {
sticker,
mut parameters,
} = self;
let mut form = Form::default();
parameters.sticker = Some(sticker.write(&mut form));
parameters.serialize(&mut form)?;
Payload::form("replaceStickerInSet", form)
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize)]
pub struct SetCustomEmojiStickerSetThumbnail {
name: String,
custom_emoji_id: Option<String>,
}
impl SetCustomEmojiStickerSetThumbnail {
pub fn new<T>(name: T) -> Self
where
T: Into<String>,
{
Self {
name: name.into(),
custom_emoji_id: None,
}
}
pub fn with_custom_emoji_id<T>(mut self, value: T) -> Self
where
T: Into<String>,
{
self.custom_emoji_id = Some(value.into());
self
}
}
impl Method for SetCustomEmojiStickerSetThumbnail {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("setCustomEmojiStickerSetThumbnail", self)
}
}
#[derive(Clone, Debug, Serialize)]
pub struct SetStickerPositionInSet {
position: Integer,
sticker: String,
}
impl SetStickerPositionInSet {
pub fn new<T>(position: Integer, sticker: T) -> Self
where
T: Into<String>,
{
Self {
position,
sticker: sticker.into(),
}
}
}
impl Method for SetStickerPositionInSet {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("setStickerPositionInSet", self)
}
}
#[derive(Clone, Debug, Serialize)]
pub struct SetStickerSetTitle {
name: String,
title: String,
}
impl SetStickerSetTitle {
pub fn new<A, B>(name: A, title: B) -> Self
where
A: Into<String>,
B: Into<String>,
{
Self {
name: name.into(),
title: title.into(),
}
}
}
impl Method for SetStickerSetTitle {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("setStickerSetTitle", self)
}
}
#[derive(Debug)]
pub struct SetStickerSetThumbnail {
parameters: SetStickerSetThumbnailParameters,
thumbnail: Option<InputFile>,
}
impl SetStickerSetThumbnail {
pub fn new<N>(name: N, user_id: Integer, format: StickerFormat) -> Self
where
N: Into<String>,
{
Self {
parameters: SetStickerSetThumbnailParameters {
name: Some(name.into()),
user_id: Some(user_id),
format: Some(format),
..Default::default()
},
thumbnail: None,
}
}
pub fn with_thumbnail<T>(mut self, value: T) -> Self
where
T: Into<InputFile>,
{
self.thumbnail = Some(value.into());
self
}
}
#[derive(Debug, Default, Serialize)]
struct SetStickerSetThumbnailParameters {
format: Option<StickerFormat>,
name: Option<String>,
thumbnail: Option<String>,
user_id: Option<Integer>,
}
impl Method for SetStickerSetThumbnail {
type Response = bool;
fn into_payload(self) -> Result<Payload, PayloadError> {
let Self {
thumbnail,
mut parameters,
} = self;
let mut form = Form::default();
parameters.thumbnail = thumbnail.map(|x| x.write(&mut form));
parameters.serialize(&mut form)?;
Payload::form("setStickerSetThumbnail", form)
}
}