twilight_http/request/guild/member/
search_guild_members.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 guild::Member,
12 id::{Id, marker::GuildMarker},
13};
14use twilight_validate::request::{
15 ValidationError, search_guild_members_limit as validate_search_guild_members_limit,
16};
17
18struct SearchGuildMembersFields<'a> {
19 query: &'a str,
20 limit: Option<u16>,
21}
22
23#[must_use = "requests must be configured and executed"]
54pub struct SearchGuildMembers<'a> {
55 fields: Result<SearchGuildMembersFields<'a>, ValidationError>,
56 guild_id: Id<GuildMarker>,
57 http: &'a Client,
58}
59
60impl<'a> SearchGuildMembers<'a> {
61 pub(crate) const fn new(http: &'a Client, guild_id: Id<GuildMarker>, query: &'a str) -> Self {
62 Self {
63 fields: Ok(SearchGuildMembersFields { query, limit: None }),
64 guild_id,
65 http,
66 }
67 }
68
69 pub fn limit(mut self, limit: u16) -> Self {
80 self.fields = self.fields.and_then(|mut fields| {
81 validate_search_guild_members_limit(limit)?;
82 fields.limit = Some(limit);
83
84 Ok(fields)
85 });
86
87 self
88 }
89}
90
91#[cfg(not(target_os = "wasi"))]
92impl IntoFuture for SearchGuildMembers<'_> {
93 type Output = Result<Response<ListBody<Member>>, Error>;
94
95 type IntoFuture = ResponseFuture<ListBody<Member>>;
96
97 fn into_future(self) -> Self::IntoFuture {
98 let http = self.http;
99
100 match self.try_into_request() {
101 Ok(request) => http.request(request),
102 Err(source) => ResponseFuture::error(source),
103 }
104 }
105}
106
107impl TryIntoRequest for SearchGuildMembers<'_> {
108 fn try_into_request(self) -> Result<Request, Error> {
109 let fields = self.fields.map_err(Error::validation)?;
110
111 Ok(Request::from_route(&Route::SearchGuildMembers {
112 guild_id: self.guild_id.get(),
113 limit: fields.limit,
114 query: fields.query,
115 }))
116 }
117}