1#![allow(clippy::option_option)]
9
10#[cfg(feature = "http")]
11use crate::http::CacheHttp;
12#[cfg(feature = "http")]
13use crate::internal::prelude::*;
14
15#[cfg(feature = "http")]
17#[async_trait::async_trait]
18pub trait Builder {
19 type Context<'ctx>;
21 type Built;
22 async fn execute(
24 self,
25 cache_http: impl CacheHttp,
26 ctx: Self::Context<'_>,
27 ) -> Result<Self::Built>;
28}
29
30#[cfg(feature = "http")]
31pub(crate) fn check_overflow(len: usize, max: usize) -> StdResult<(), usize> {
32 if len > max {
33 Err(len - max)
34 } else {
35 Ok(())
36 }
37}
38
39mod add_member;
40mod bot_auth_parameters;
41mod create_allowed_mentions;
42mod create_attachment;
43mod create_channel;
44mod create_command;
45mod create_command_permission;
46mod create_components;
47mod create_embed;
48mod create_forum_post;
49mod create_forum_tag;
50mod create_interaction_response;
51mod create_interaction_response_followup;
52mod create_invite;
53mod create_message;
54pub mod create_poll;
55mod create_scheduled_event;
56mod create_soundboard;
57mod create_stage_instance;
58mod create_sticker;
59mod create_thread;
60mod create_webhook;
61mod edit_automod_rule;
62mod edit_channel;
63mod edit_guild;
64mod edit_guild_incident_actions;
65mod edit_guild_welcome_screen;
66mod edit_guild_widget;
67mod edit_interaction_response;
68mod edit_member;
69mod edit_message;
70mod edit_profile;
71mod edit_role;
72mod edit_scheduled_event;
73mod edit_soundboard;
74mod edit_stage_instance;
75mod edit_sticker;
76mod edit_thread;
77mod edit_voice_state;
78mod edit_webhook;
79mod edit_webhook_message;
80mod execute_webhook;
81mod get_entitlements;
82mod get_messages;
83
84pub use add_member::*;
85pub use bot_auth_parameters::*;
86pub use create_allowed_mentions::*;
87pub use create_attachment::*;
88pub use create_channel::*;
89pub use create_command::*;
90pub use create_command_permission::*;
91pub use create_components::*;
92pub use create_embed::*;
93pub use create_forum_post::*;
94pub use create_forum_tag::*;
95pub use create_interaction_response::*;
96pub use create_interaction_response_followup::*;
97pub use create_invite::*;
98pub use create_message::*;
99pub use create_poll::{CreatePoll, CreatePollAnswer};
100pub use create_scheduled_event::*;
101pub use create_soundboard::*;
102pub use create_stage_instance::*;
103pub use create_sticker::*;
104pub use create_thread::*;
105pub use create_webhook::*;
106pub use edit_automod_rule::*;
107pub use edit_channel::*;
108pub use edit_guild::*;
109pub use edit_guild_incident_actions::*;
110pub use edit_guild_welcome_screen::*;
111pub use edit_guild_widget::*;
112pub use edit_interaction_response::*;
113pub use edit_member::*;
114pub use edit_message::*;
115pub use edit_profile::*;
116pub use edit_role::*;
117pub use edit_scheduled_event::*;
118pub use edit_soundboard::*;
119pub use edit_stage_instance::*;
120pub use edit_sticker::*;
121pub use edit_thread::*;
122pub use edit_voice_state::*;
123pub use edit_webhook::*;
124pub use edit_webhook_message::*;
125pub use execute_webhook::*;
126pub use get_entitlements::*;
127pub use get_messages::*;
128
129macro_rules! button_and_select_menu_convenience_methods {
130 ($self:ident $(. $components_path:tt)+) => {
131 pub fn button(mut $self, button: super::CreateButton) -> Self {
136 let rows = $self$(.$components_path)+.get_or_insert_with(Vec::new);
137 let row_with_space_left = rows.last_mut().and_then(|row| match row {
138 super::CreateActionRow::Buttons(buttons) if buttons.len() < 5 => Some(buttons),
139 _ => None,
140 });
141 match row_with_space_left {
142 Some(row) => row.push(button),
143 None => rows.push(super::CreateActionRow::Buttons(vec![button])),
144 }
145 $self
146 }
147
148 pub fn select_menu(mut $self, select_menu: super::CreateSelectMenu) -> Self {
152 $self$(.$components_path)+
153 .get_or_insert_with(Vec::new)
154 .push(super::CreateActionRow::SelectMenu(select_menu));
155 $self
156 }
157 };
158}
159
160use button_and_select_menu_convenience_methods;