Skip to main content

twilight_http/request/scheduled_event/
get_guild_scheduled_event_users.rs

1#[cfg(not(target_os = "wasi"))]
2use crate::response::{Response, ResponseFuture, marker::ListBody};
3use crate::{
4    client::Client,
5    error::Error,
6    request::{Request, TryIntoRequest},
7    routing::Route,
8};
9use std::future::IntoFuture;
10use twilight_model::{
11    guild::scheduled_event::GuildScheduledEventUser,
12    id::{
13        Id,
14        marker::{GuildMarker, ScheduledEventMarker, UserMarker},
15    },
16};
17use twilight_validate::request::{
18    ValidationError, scheduled_event_get_users as validate_scheduled_event_get_users,
19};
20
21struct GetGuildScheduledEventUsersFields {
22    after: Option<Id<UserMarker>>,
23    before: Option<Id<UserMarker>>,
24    limit: Option<u16>,
25    scheduled_event_id: Id<ScheduledEventMarker>,
26    with_member: Option<bool>,
27}
28
29/// Get a list of users subscribed to a scheduled event.
30///
31/// Users are returned in ascending order by `user_id`. [`before`] and [`after`]
32/// both take a user id. If both are specified, only [`before`] is respected.
33/// The default [`limit`] is 100. See
34/// [Discord Docs/Get Guild Scheduled Event Users].
35///
36/// [`after`]: GetGuildScheduledEventUsers::after
37/// [`before`]: GetGuildScheduledEventUsers::before
38/// [`limit`]: GetGuildScheduledEventUsers::limit
39/// [Discord Docs/Get Guild Scheduled Event Users]: https://discord.com/developers/docs/resources/guild-scheduled-event#get-guild-scheduled-event-users
40#[must_use = "requests must be configured and executed"]
41pub struct GetGuildScheduledEventUsers<'a> {
42    fields: Result<GetGuildScheduledEventUsersFields, ValidationError>,
43    guild_id: Id<GuildMarker>,
44    http: &'a Client,
45}
46
47impl<'a> GetGuildScheduledEventUsers<'a> {
48    pub(crate) const fn new(
49        http: &'a Client,
50        guild_id: Id<GuildMarker>,
51        scheduled_event_id: Id<ScheduledEventMarker>,
52    ) -> Self {
53        Self {
54            fields: Ok(GetGuildScheduledEventUsersFields {
55                after: None,
56                before: None,
57                limit: None,
58                scheduled_event_id,
59                with_member: None,
60            }),
61            guild_id,
62            http,
63        }
64    }
65
66    /// Get users after this user ID.
67    ///
68    /// This is incompatible with [`before`], and has no effect if [`before`] is
69    /// also set.
70    ///
71    /// [`before`]: Self::before
72    pub const fn after(mut self, after: Id<UserMarker>) -> Self {
73        if let Ok(fields) = self.fields.as_mut() {
74            fields.after = Some(after);
75        }
76
77        self
78    }
79
80    /// Get users before this user ID.
81    ///
82    /// This is incompatible with [`after`].
83    ///
84    /// [`after`]: Self::after
85    pub const fn before(mut self, before: Id<UserMarker>) -> Self {
86        if let Ok(fields) = self.fields.as_mut() {
87            fields.before = Some(before);
88        }
89
90        self
91    }
92
93    /// Set the limit of users to return.
94    ///
95    /// If not specified, the default is 100.
96    ///
97    /// # Errors
98    ///
99    /// Returns an error of type [`ScheduledEventGetUsers`] if the limit is
100    /// invalid.
101    ///
102    /// [`ScheduledEventGetUsers`]: twilight_validate::request::ValidationErrorType::ScheduledEventGetUsers
103    pub fn limit(mut self, limit: u16) -> Self {
104        self.fields = self.fields.and_then(|mut fields| {
105            validate_scheduled_event_get_users(limit)?;
106            fields.limit = Some(limit);
107
108            Ok(fields)
109        });
110
111        self
112    }
113
114    /// Set whether to return member objects with each user.
115    pub const fn with_member(mut self, with_member: bool) -> Self {
116        if let Ok(fields) = self.fields.as_mut() {
117            fields.with_member = Some(with_member);
118        }
119
120        self
121    }
122}
123
124#[cfg(not(target_os = "wasi"))]
125impl IntoFuture for GetGuildScheduledEventUsers<'_> {
126    type Output = Result<Response<ListBody<GuildScheduledEventUser>>, Error>;
127
128    type IntoFuture = ResponseFuture<ListBody<GuildScheduledEventUser>>;
129
130    fn into_future(self) -> Self::IntoFuture {
131        let http = self.http;
132
133        match self.try_into_request() {
134            Ok(request) => http.request(request),
135            Err(source) => ResponseFuture::error(source),
136        }
137    }
138}
139
140impl TryIntoRequest for GetGuildScheduledEventUsers<'_> {
141    fn try_into_request(self) -> Result<Request, Error> {
142        let fields = self.fields.map_err(Error::validation)?;
143
144        Ok(Request::from_route(&Route::GetGuildScheduledEventUsers {
145            after: fields.after.map(Id::get),
146            before: fields.before.map(Id::get),
147            guild_id: self.guild_id.get(),
148            limit: fields.limit,
149            scheduled_event_id: fields.scheduled_event_id.get(),
150            with_member: fields.with_member.unwrap_or_default(),
151        }))
152    }
153}