revolt_models/v0/
emojis.rs

1use once_cell::sync::Lazy;
2use regex::Regex;
3
4#[cfg(feature = "validator")]
5use validator::Validate;
6
7/// Regex for valid emoji names
8///
9/// Alphanumeric and underscores
10pub static RE_EMOJI: Lazy<Regex> = Lazy::new(|| Regex::new(r"^[a-z0-9_]+$").unwrap());
11
12auto_derived!(
13    /// Emoji
14    pub struct Emoji {
15        /// Unique Id
16        #[cfg_attr(feature = "serde", serde(rename = "_id"))]
17        pub id: String,
18        /// What owns this emoji
19        pub parent: EmojiParent,
20        /// Uploader user id
21        pub creator_id: String,
22        /// Emoji name
23        pub name: String,
24        /// Whether the emoji is animated
25        #[cfg_attr(
26            feature = "serde",
27            serde(skip_serializing_if = "crate::if_false", default)
28        )]
29        pub animated: bool,
30        /// Whether the emoji is marked as nsfw
31        #[cfg_attr(
32            feature = "serde",
33            serde(skip_serializing_if = "crate::if_false", default)
34        )]
35        pub nsfw: bool,
36    }
37
38    /// Parent Id of the emoji
39    #[serde(tag = "type")]
40    pub enum EmojiParent {
41        Server { id: String },
42        Detached,
43    }
44
45    /// Create a new emoji
46    #[cfg_attr(feature = "validator", derive(Validate))]
47    pub struct DataCreateEmoji {
48        /// Server name
49        #[validate(length(min = 1, max = 32), regex = "RE_EMOJI")]
50        pub name: String,
51        /// Parent information
52        pub parent: EmojiParent,
53        /// Whether the emoji is mature
54        #[serde(default)]
55        pub nsfw: bool,
56    }
57);