twilight_http/request/guild/member/
get_guild_members.rs1use 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::Member,
11 id::{
12 marker::{GuildMarker, UserMarker},
13 Id,
14 },
15};
16use twilight_validate::request::{
17 get_guild_members_limit as validate_get_guild_members_limit, ValidationError,
18};
19
20struct GetGuildMembersFields {
21 after: Option<Id<UserMarker>>,
22 limit: Option<u16>,
23}
24
25#[must_use = "requests must be configured and executed"]
52pub struct GetGuildMembers<'a> {
53 fields: Result<GetGuildMembersFields, ValidationError>,
54 guild_id: Id<GuildMarker>,
55 http: &'a Client,
56}
57
58impl<'a> GetGuildMembers<'a> {
59 pub(crate) const fn new(http: &'a Client, guild_id: Id<GuildMarker>) -> Self {
60 Self {
61 fields: Ok(GetGuildMembersFields {
62 after: None,
63 limit: None,
64 }),
65 guild_id,
66 http,
67 }
68 }
69
70 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 pub fn limit(mut self, limit: u16) -> Self {
90 self.fields = self.fields.and_then(|mut fields| {
91 validate_get_guild_members_limit(limit)?;
92 fields.limit = Some(limit);
93
94 Ok(fields)
95 });
96
97 self
98 }
99}
100
101impl IntoFuture for GetGuildMembers<'_> {
102 type Output = Result<Response<ListBody<Member>>, Error>;
103
104 type IntoFuture = ResponseFuture<ListBody<Member>>;
105
106 fn into_future(self) -> Self::IntoFuture {
107 let http = self.http;
108
109 match self.try_into_request() {
110 Ok(request) => http.request(request),
111 Err(source) => ResponseFuture::error(source),
112 }
113 }
114}
115
116impl TryIntoRequest for GetGuildMembers<'_> {
117 fn try_into_request(self) -> Result<Request, Error> {
118 let fields = self.fields.map_err(Error::validation)?;
119
120 Ok(Request::from_route(&Route::GetGuildMembers {
121 after: fields.after.map(Id::get),
122 guild_id: self.guild_id.get(),
123 limit: fields.limit,
124 }))
125 }
126}