mod format_type;
mod kind;
mod message;
mod pack;
pub use self::{
format_type::StickerFormatType, kind::StickerType, message::MessageSticker, pack::StickerPack,
};
use crate::{
id::{
marker::{GuildMarker, StickerMarker, StickerPackMarker},
Id,
},
user::User,
util::is_false,
};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub struct Sticker {
#[serde(default, skip_serializing_if = "is_false")]
pub available: bool,
pub description: Option<String>,
pub format_type: StickerFormatType,
#[serde(skip_serializing_if = "Option::is_none")]
pub guild_id: Option<Id<GuildMarker>>,
pub id: Id<StickerMarker>,
#[serde(rename = "type")]
pub kind: StickerType,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub pack_id: Option<Id<StickerPackMarker>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_value: Option<u64>,
pub tags: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<User>,
}
#[cfg(test)]
mod tests {
use super::{Sticker, StickerFormatType, StickerType, User};
use crate::{
id::Id,
test::image_hash,
user::{PremiumType, UserFlags},
};
use serde::{Deserialize, Serialize};
use serde_test::Token;
use static_assertions::{assert_fields, assert_impl_all};
use std::{fmt::Debug, hash::Hash};
assert_fields!(
Sticker: available,
description,
format_type,
guild_id,
id,
kind,
name,
pack_id,
sort_value,
tags,
user
);
assert_impl_all!(
Sticker: Clone,
Debug,
Deserialize<'static>,
Eq,
Hash,
PartialEq,
Send,
Serialize,
Sync,
);
#[test]
fn minimal() {
let value = Sticker {
available: false,
description: Some("foo2".to_owned()),
format_type: StickerFormatType::Png,
guild_id: None,
id: Id::new(1),
kind: StickerType::Standard,
name: "sticker name".to_owned(),
pack_id: None,
sort_value: None,
tags: "foo,bar,baz".to_owned(),
user: None,
};
serde_test::assert_tokens(
&value,
&[
Token::Struct {
name: "Sticker",
len: 6,
},
Token::Str("description"),
Token::Some,
Token::Str("foo2"),
Token::Str("format_type"),
Token::U8(StickerFormatType::Png.into()),
Token::Str("id"),
Token::NewtypeStruct { name: "Id" },
Token::Str("1"),
Token::Str("type"),
Token::U8(1),
Token::Str("name"),
Token::Str("sticker name"),
Token::Str("tags"),
Token::Str("foo,bar,baz"),
Token::StructEnd,
],
);
}
#[allow(clippy::too_many_lines)]
#[test]
fn full() {
let value = Sticker {
available: true,
description: Some("sticker".into()),
format_type: StickerFormatType::Png,
guild_id: Some(Id::new(1)),
id: Id::new(2),
kind: StickerType::Guild,
name: "stick".into(),
pack_id: Some(Id::new(3)),
sort_value: Some(1),
tags: "foo,bar,baz".into(),
user: Some(User {
accent_color: None,
avatar: Some(image_hash::AVATAR),
avatar_decoration: None,
avatar_decoration_data: None,
banner: None,
bot: false,
discriminator: 1,
email: Some("address@example.com".to_owned()),
flags: Some(UserFlags::PREMIUM_EARLY_SUPPORTER | UserFlags::VERIFIED_DEVELOPER),
global_name: Some("test".to_owned()),
id: Id::new(1),
locale: Some("en-us".to_owned()),
mfa_enabled: Some(true),
name: "test".to_owned(),
premium_type: Some(PremiumType::Nitro),
public_flags: Some(
UserFlags::PREMIUM_EARLY_SUPPORTER | UserFlags::VERIFIED_DEVELOPER,
),
system: Some(true),
verified: Some(true),
}),
};
serde_test::assert_tokens(
&value,
&[
Token::Struct {
name: "Sticker",
len: 11,
},
Token::Str("available"),
Token::Bool(true),
Token::Str("description"),
Token::Some,
Token::Str("sticker"),
Token::Str("format_type"),
Token::U8(StickerFormatType::Png.into()),
Token::Str("guild_id"),
Token::Some,
Token::NewtypeStruct { name: "Id" },
Token::Str("1"),
Token::Str("id"),
Token::NewtypeStruct { name: "Id" },
Token::Str("2"),
Token::Str("type"),
Token::U8(2),
Token::Str("name"),
Token::Str("stick"),
Token::Str("pack_id"),
Token::Some,
Token::NewtypeStruct { name: "Id" },
Token::Str("3"),
Token::Str("sort_value"),
Token::Some,
Token::U64(1),
Token::Str("tags"),
Token::Str("foo,bar,baz"),
Token::Str("user"),
Token::Some,
Token::Struct {
name: "User",
len: 18,
},
Token::Str("accent_color"),
Token::None,
Token::Str("avatar"),
Token::Some,
Token::Str(image_hash::AVATAR_INPUT),
Token::Str("avatar_decoration"),
Token::None,
Token::Str("avatar_decoration_data"),
Token::None,
Token::Str("banner"),
Token::None,
Token::Str("bot"),
Token::Bool(false),
Token::Str("discriminator"),
Token::Str("0001"),
Token::Str("email"),
Token::Some,
Token::Str("address@example.com"),
Token::Str("flags"),
Token::Some,
Token::U64(131_584),
Token::Str("global_name"),
Token::Some,
Token::Str("test"),
Token::Str("id"),
Token::NewtypeStruct { name: "Id" },
Token::Str("1"),
Token::Str("locale"),
Token::Some,
Token::Str("en-us"),
Token::Str("mfa_enabled"),
Token::Some,
Token::Bool(true),
Token::Str("username"),
Token::Str("test"),
Token::Str("premium_type"),
Token::Some,
Token::U8(2),
Token::Str("public_flags"),
Token::Some,
Token::U64(131_584),
Token::Str("system"),
Token::Some,
Token::Bool(true),
Token::Str("verified"),
Token::Some,
Token::Bool(true),
Token::StructEnd,
Token::StructEnd,
],
);
}
}