twilight_http/request/user/
get_current_user_guilds.rs1#[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 id::{Id, marker::GuildMarker},
12 user::CurrentUserGuild,
13};
14use twilight_validate::request::{
15 ValidationError, get_current_user_guilds_limit as validate_get_current_user_guilds_limit,
16};
17
18struct GetCurrentUserGuildsFields {
19 after: Option<Id<GuildMarker>>,
20 before: Option<Id<GuildMarker>>,
21 limit: Option<u16>,
22}
23
24#[must_use = "requests must be configured and executed"]
50pub struct GetCurrentUserGuilds<'a> {
51 fields: Result<GetCurrentUserGuildsFields, ValidationError>,
52 http: &'a Client,
53}
54
55impl<'a> GetCurrentUserGuilds<'a> {
56 pub(crate) const fn new(http: &'a Client) -> Self {
57 Self {
58 fields: Ok(GetCurrentUserGuildsFields {
59 after: None,
60 before: None,
61 limit: None,
62 }),
63 http,
64 }
65 }
66
67 pub const fn after(mut self, guild_id: Id<GuildMarker>) -> Self {
69 if let Ok(fields) = self.fields.as_mut() {
70 fields.after = Some(guild_id);
71 }
72
73 self
74 }
75
76 pub const fn before(mut self, guild_id: Id<GuildMarker>) -> Self {
78 if let Ok(fields) = self.fields.as_mut() {
79 fields.before = Some(guild_id);
80 }
81
82 self
83 }
84
85 pub fn limit(mut self, limit: u16) -> Self {
98 self.fields = self.fields.and_then(|mut fields| {
99 validate_get_current_user_guilds_limit(limit)?;
100 fields.limit = Some(limit);
101
102 Ok(fields)
103 });
104
105 self
106 }
107}
108
109#[cfg(not(target_os = "wasi"))]
110impl IntoFuture for GetCurrentUserGuilds<'_> {
111 type Output = Result<Response<ListBody<CurrentUserGuild>>, Error>;
112
113 type IntoFuture = ResponseFuture<ListBody<CurrentUserGuild>>;
114
115 fn into_future(self) -> Self::IntoFuture {
116 let http = self.http;
117
118 match self.try_into_request() {
119 Ok(request) => http.request(request),
120 Err(source) => ResponseFuture::error(source),
121 }
122 }
123}
124
125impl TryIntoRequest for GetCurrentUserGuilds<'_> {
126 fn try_into_request(self) -> Result<Request, Error> {
127 let fields = self.fields.map_err(Error::validation)?;
128
129 Ok(Request::from_route(&Route::GetGuilds {
130 after: fields.after.map(Id::get),
131 before: fields.before.map(Id::get),
132 limit: fields.limit,
133 }))
134 }
135}