twilight_http/request/channel/thread/
get_thread_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 channel::thread::ThreadMember,
11 id::{
12 marker::{ChannelMarker, UserMarker},
13 Id,
14 },
15};
16use twilight_validate::channel::{thread_member_limit, ChannelValidationError};
17
18struct GetThreadMembersFields {
19 after: Option<Id<UserMarker>>,
20 limit: Option<u32>,
21 with_member: Option<bool>,
22}
23
24#[must_use = "requests must be configured and executed"]
28pub struct GetThreadMembers<'a> {
29 channel_id: Id<ChannelMarker>,
30 fields: Result<GetThreadMembersFields, ChannelValidationError>,
31 http: &'a Client,
32}
33
34impl<'a> GetThreadMembers<'a> {
35 pub(crate) const fn new(http: &'a Client, channel_id: Id<ChannelMarker>) -> Self {
36 Self {
37 channel_id,
38 fields: Ok(GetThreadMembersFields {
39 after: None,
40 limit: None,
41 with_member: None,
42 }),
43 http,
44 }
45 }
46
47 pub fn after(mut self, after: Id<UserMarker>) -> Self {
49 if let Ok(fields) = self.fields.as_mut() {
50 fields.after = Some(after);
51 }
52
53 self
54 }
55
56 pub fn limit(mut self, limit: u32) -> Self {
67 self.fields = self.fields.and_then(|mut fields| {
68 thread_member_limit(limit)?;
69 fields.limit = Some(limit);
70
71 Ok(fields)
72 });
73
74 self
75 }
76
77 pub fn with_member(mut self, with_member: bool) -> Self {
79 if let Ok(fields) = self.fields.as_mut() {
80 fields.with_member = Some(with_member);
81 }
82
83 self
84 }
85}
86
87impl IntoFuture for GetThreadMembers<'_> {
88 type Output = Result<Response<ListBody<ThreadMember>>, Error>;
89
90 type IntoFuture = ResponseFuture<ListBody<ThreadMember>>;
91
92 fn into_future(self) -> Self::IntoFuture {
93 let http = self.http;
94
95 match self.try_into_request() {
96 Ok(request) => http.request(request),
97 Err(source) => ResponseFuture::error(source),
98 }
99 }
100}
101
102impl TryIntoRequest for GetThreadMembers<'_> {
103 fn try_into_request(self) -> Result<Request, Error> {
104 let fields = self.fields.map_err(Error::validation)?;
105
106 Ok(Request::from_route(&Route::GetThreadMembers {
107 after: fields.after.map(Id::get),
108 channel_id: self.channel_id.get(),
109 limit: fields.limit,
110 with_member: fields.with_member,
111 }))
112 }
113}