rustigram_types/
sticker.rs1use crate::file::PhotoSize;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct Sticker {
7 pub file_id: String,
9 pub file_unique_id: String,
11 #[serde(rename = "type")]
13 pub kind: StickerType,
14 pub width: u32,
16 pub height: u32,
18 pub is_animated: bool,
20 pub is_video: bool,
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub thumbnail: Option<PhotoSize>,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub emoji: Option<String>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub set_name: Option<String>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub premium_animation: Option<crate::file::File>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub mask_position: Option<MaskPosition>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub custom_emoji_id: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub needs_repainting: Option<bool>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub file_size: Option<u64>,
46}
47
48#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
49#[serde(rename_all = "snake_case")]
50pub enum StickerType {
52 Regular,
54 Mask,
56 CustomEmoji,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct MaskPosition {
63 pub point: MaskPoint,
65 pub x_shift: f64,
67 pub y_shift: f64,
69 pub scale: f64,
71}
72
73#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
74#[serde(rename_all = "snake_case")]
75pub enum MaskPoint {
77 Forehead,
79 Eyes,
81 Mouth,
83 Chin,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct StickerSet {
90 pub name: String,
92 pub title: String,
94 pub sticker_type: StickerType,
96 pub stickers: Vec<Sticker>,
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub thumbnail: Option<PhotoSize>,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct InputSticker {
110 pub sticker: String,
112 pub format: StickerFormat,
114 pub emoji_list: Vec<String>,
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub mask_position: Option<MaskPosition>,
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub keywords: Option<Vec<String>>,
122}
123
124impl InputSticker {
125 pub fn new(
127 sticker: impl Into<String>,
128 format: StickerFormat,
129 emoji_list: Vec<impl Into<String>>,
130 ) -> Self {
131 Self {
132 sticker: sticker.into(),
133 format,
134 emoji_list: emoji_list.into_iter().map(Into::into).collect(),
135 mask_position: None,
136 keywords: None,
137 }
138 }
139 pub fn mask_position(mut self, mp: MaskPosition) -> Self {
141 self.mask_position = Some(mp);
142 self
143 }
144 pub fn keywords(mut self, kw: Vec<impl Into<String>>) -> Self {
146 self.keywords = Some(kw.into_iter().map(Into::into).collect());
147 self
148 }
149}
150
151#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
153#[serde(rename_all = "snake_case")]
154pub enum StickerFormat {
155 Static,
157 Animated,
159 Video,
161}