twilight_model/application/interaction/
message_component.rs

1//! [`MessageComponent`] interaction.
2//!
3//! [`MessageComponent`]: crate::application::interaction::InteractionType::MessageComponent
4
5use crate::application::interaction::InteractionDataResolved;
6use crate::channel::message::component::ComponentType;
7use serde::{Deserialize, Serialize};
8
9/// Data received when a [`MessageComponent`] interaction is executed.
10///
11/// See [Discord Docs/Message Component Data Structure].
12///
13/// [`MessageComponent`]: crate::application::interaction::InteractionType::MessageComponent
14/// [Discord Docs/Message Component Data Structure]: https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-message-component-data-structure
15#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
16pub struct MessageComponentInteractionData {
17    /// User defined identifier for the component.
18    ///
19    /// See [Discord Docs/Custom ID].
20    ///
21    /// [Discord Docs/Custom ID]: https://discord.com/developers/docs/interactions/message-components#custom-id
22    pub custom_id: String,
23    /// Type of the component.
24    pub component_type: ComponentType,
25    /// Converted users, roles, channels, or attachments.
26    ///
27    /// Only used for [`SelectMenu`] components.
28    ///
29    /// [`SelectMenu`]: crate::channel::message::component::SelectMenu
30    pub resolved: Option<InteractionDataResolved>,
31    /// Values selected by the user.
32    ///
33    /// Only used for [`SelectMenu`] components.
34    ///
35    /// [`SelectMenu`]: crate::channel::message::component::SelectMenu
36    #[serde(default)]
37    pub values: Vec<String>,
38}
39
40#[cfg(test)]
41mod tests {
42    use super::MessageComponentInteractionData;
43    use crate::channel::message::component::ComponentType;
44    use serde::{Deserialize, Serialize};
45    use serde_test::Token;
46    use static_assertions::{assert_fields, assert_impl_all};
47    use std::fmt::Debug;
48
49    assert_fields!(
50        MessageComponentInteractionData: custom_id,
51        component_type,
52        values
53    );
54    assert_impl_all!(
55        MessageComponentInteractionData: Clone,
56        Debug,
57        Deserialize<'static>,
58        PartialEq,
59        Send,
60        Serialize,
61        Sync
62    );
63
64    #[test]
65    fn message_component_interaction_data() {
66        let value = MessageComponentInteractionData {
67            custom_id: "test".to_owned(),
68            component_type: ComponentType::Button,
69            resolved: None,
70            values: Vec::from(["1".to_owned(), "2".to_owned()]),
71        };
72
73        serde_test::assert_tokens(
74            &value,
75            &[
76                Token::Struct {
77                    name: "MessageComponentInteractionData",
78                    len: 4,
79                },
80                Token::String("custom_id"),
81                Token::String("test"),
82                Token::String("component_type"),
83                Token::U8(ComponentType::Button.into()),
84                Token::String("resolved"),
85                Token::None,
86                Token::String("values"),
87                Token::Seq { len: Some(2) },
88                Token::String("1"),
89                Token::String("2"),
90                Token::SeqEnd,
91                Token::StructEnd,
92            ],
93        )
94    }
95}