twilight_http/request/scheduled_event/
get_guild_scheduled_event_users.rs

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