Skip to main content

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    /// Type of the component.
18    pub component_type: ComponentType,
19    /// User defined identifier for the component.
20    ///
21    /// See [Discord Docs/Custom ID].
22    ///
23    /// [Discord Docs/Custom ID]: https://discord.com/developers/docs/interactions/message-components#custom-id
24    pub custom_id: String,
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: component_type,
51        custom_id,
52        resolved,
53        values
54    );
55    assert_impl_all!(
56        MessageComponentInteractionData: Clone,
57        Debug,
58        Deserialize<'static>,
59        PartialEq,
60        Send,
61        Serialize,
62        Sync
63    );
64
65    #[test]
66    fn message_component_interaction_data() {
67        let value = MessageComponentInteractionData {
68            component_type: ComponentType::Button,
69            custom_id: "test".to_owned(),
70            resolved: None,
71            values: Vec::from(["1".to_owned(), "2".to_owned()]),
72        };
73
74        serde_test::assert_tokens(
75            &value,
76            &[
77                Token::Struct {
78                    name: "MessageComponentInteractionData",
79                    len: 4,
80                },
81                Token::String("component_type"),
82                Token::U8(ComponentType::Button.into()),
83                Token::String("custom_id"),
84                Token::String("test"),
85                Token::String("resolved"),
86                Token::None,
87                Token::String("values"),
88                Token::Seq { len: Some(2) },
89                Token::String("1"),
90                Token::String("2"),
91                Token::SeqEnd,
92                Token::StructEnd,
93            ],
94        )
95    }
96}