twilight_http/request/channel/thread/
get_thread_members.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    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/// Returns the [`ThreadMember`]s of the thread.
25///
26/// [`ThreadMember`]: twilight_model::channel::thread::ThreadMember
27#[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    /// Fetch the thread members after the user ID.
48    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    /// The maximum number of thread members to return.
57    ///
58    /// Must be between 1 and 100. Defaults to 100.
59    ///
60    /// # Errors
61    ///
62    /// Returns a [`ChannelValidationErrorType::ThreadMemberLimitInvalid`] error type if the
63    /// limit is not between 1 and 100.
64    ///
65    /// [`ChannelValidationErrorType::ThreadMemberLimitInvalid`]: twilight_validate::channel::ChannelValidationErrorType::ThreadMemberLimitInvalid
66    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    /// Include the associated guild members for each thread member.
78    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}