use crate::{
id::{
marker::{EmojiMarker, RoleMarker},
Id,
},
user::User,
};
use serde::{Deserialize, Serialize};
#[allow(clippy::struct_excessive_bools)]
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub struct Emoji {
#[serde(default)]
pub animated: bool,
#[serde(default)]
pub available: bool,
pub id: Id<EmojiMarker>,
#[serde(default)]
pub managed: bool,
pub name: String,
#[serde(default)]
pub require_colons: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub roles: Vec<Id<RoleMarker>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<User>,
}
#[cfg(test)]
mod tests {
use super::{Emoji, User};
use crate::id::Id;
use serde_test::Token;
#[test]
fn emoji() {
let emoji = Emoji {
animated: false,
available: true,
id: Id::new(100_000_000_000_000_000),
managed: false,
name: "test".to_owned(),
require_colons: true,
roles: Vec::new(),
user: Some(User {
accent_color: None,
avatar: None,
avatar_decoration: None,
avatar_decoration_data: None,
banner: None,
bot: false,
discriminator: 1,
email: None,
flags: None,
global_name: Some("test".to_owned()),
id: Id::new(1),
locale: None,
mfa_enabled: None,
name: "test".to_owned(),
premium_type: None,
public_flags: None,
system: None,
verified: None,
}),
};
serde_test::assert_tokens(
&emoji,
&[
Token::Struct {
name: "Emoji",
len: 7,
},
Token::Str("animated"),
Token::Bool(false),
Token::Str("available"),
Token::Bool(true),
Token::Str("id"),
Token::NewtypeStruct { name: "Id" },
Token::Str("100000000000000000"),
Token::Str("managed"),
Token::Bool(false),
Token::Str("name"),
Token::Str("test"),
Token::Str("require_colons"),
Token::Bool(true),
Token::Str("user"),
Token::Some,
Token::Struct {
name: "User",
len: 10,
},
Token::Str("accent_color"),
Token::None,
Token::Str("avatar"),
Token::None,
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("global_name"),
Token::Some,
Token::Str("test"),
Token::Str("id"),
Token::NewtypeStruct { name: "Id" },
Token::Str("1"),
Token::Str("username"),
Token::Str("test"),
Token::StructEnd,
Token::StructEnd,
],
)
}
#[test]
fn emoji_complete() {
let emoji = Emoji {
animated: false,
available: true,
id: Id::new(100_000_000_000_000_000),
managed: false,
name: "test".to_owned(),
require_colons: true,
roles: vec![Id::new(1)],
user: Some(User {
accent_color: None,
avatar: None,
avatar_decoration: None,
avatar_decoration_data: None,
banner: None,
bot: false,
discriminator: 1,
email: None,
flags: None,
global_name: Some("test".to_owned()),
id: Id::new(1),
locale: None,
mfa_enabled: None,
name: "test".to_owned(),
premium_type: None,
public_flags: None,
system: None,
verified: None,
}),
};
serde_test::assert_tokens(
&emoji,
&[
Token::Struct {
name: "Emoji",
len: 8,
},
Token::Str("animated"),
Token::Bool(false),
Token::Str("available"),
Token::Bool(true),
Token::Str("id"),
Token::NewtypeStruct { name: "Id" },
Token::Str("100000000000000000"),
Token::Str("managed"),
Token::Bool(false),
Token::Str("name"),
Token::Str("test"),
Token::Str("require_colons"),
Token::Bool(true),
Token::Str("roles"),
Token::Seq { len: Some(1) },
Token::NewtypeStruct { name: "Id" },
Token::Str("1"),
Token::SeqEnd,
Token::Str("user"),
Token::Some,
Token::Struct {
name: "User",
len: 10,
},
Token::Str("accent_color"),
Token::None,
Token::Str("avatar"),
Token::None,
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("global_name"),
Token::Some,
Token::Str("test"),
Token::Str("id"),
Token::NewtypeStruct { name: "Id" },
Token::Str("1"),
Token::Str("username"),
Token::Str("test"),
Token::StructEnd,
Token::StructEnd,
],
)
}
}