use crate::{
id::{
Id,
marker::{RoleMarker, UserMarker},
},
util::is_false,
};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub struct AllowedMentions {
#[serde(default)]
pub parse: Vec<MentionType>,
#[serde(default, skip_serializing_if = "is_false")]
pub replied_user: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub roles: Vec<Id<RoleMarker>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub users: Vec<Id<UserMarker>>,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[non_exhaustive]
#[serde(rename_all = "lowercase")]
pub enum MentionType {
Everyone,
Roles,
Users,
}
#[cfg(test)]
mod tests {
use super::{AllowedMentions, MentionType};
use crate::id::Id;
use serde_test::Token;
#[test]
fn minimal() {
let value = AllowedMentions {
parse: Vec::new(),
users: Vec::new(),
roles: Vec::new(),
replied_user: false,
};
serde_test::assert_tokens(
&value,
&[
Token::Struct {
name: "AllowedMentions",
len: 1,
},
Token::Str("parse"),
Token::Seq { len: Some(0) },
Token::SeqEnd,
Token::StructEnd,
],
);
}
#[test]
fn full() {
let value = AllowedMentions {
parse: Vec::from([MentionType::Everyone]),
users: Vec::from([Id::new(100)]),
roles: Vec::from([Id::new(200)]),
replied_user: true,
};
serde_test::assert_tokens(
&value,
&[
Token::Struct {
name: "AllowedMentions",
len: 4,
},
Token::Str("parse"),
Token::Seq { len: Some(1) },
Token::UnitVariant {
name: "MentionType",
variant: "everyone",
},
Token::SeqEnd,
Token::Str("replied_user"),
Token::Bool(true),
Token::Str("roles"),
Token::Seq { len: Some(1) },
Token::NewtypeStruct { name: "Id" },
Token::Str("200"),
Token::SeqEnd,
Token::Str("users"),
Token::Seq { len: Some(1) },
Token::NewtypeStruct { name: "Id" },
Token::Str("100"),
Token::SeqEnd,
Token::StructEnd,
],
);
}
}