twilight_http/request/poll/
get_answer_voters.rs

1use crate::{
2    client::Client,
3    error::Error,
4    request::{Request, TryIntoRequest},
5    response::{Response, ResponseFuture},
6    routing::Route,
7};
8use serde::{Deserialize, Serialize};
9use std::future::IntoFuture;
10use twilight_model::{
11    id::{
12        marker::{ChannelMarker, MessageMarker, UserMarker},
13        Id,
14    },
15    user::User,
16};
17
18#[derive(Serialize)]
19struct GetAnswerVotersFields {
20    after: Option<Id<UserMarker>>,
21    answer_id: u8,
22    channel_id: Id<ChannelMarker>,
23    limit: Option<u8>,
24    message_id: Id<MessageMarker>,
25}
26
27/// Gets the data for a poll answer.
28#[must_use = "requests must be configured and executed"]
29pub struct GetAnswerVoters<'a> {
30    fields: GetAnswerVotersFields,
31    http: &'a Client,
32}
33
34#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
35pub struct GetAnswerVotersResponse {
36    pub users: Vec<User>,
37}
38
39impl<'a> GetAnswerVoters<'a> {
40    pub(crate) const fn new(
41        http: &'a Client,
42        channel_id: Id<ChannelMarker>,
43        message_id: Id<MessageMarker>,
44        answer_id: u8,
45    ) -> Self {
46        Self {
47            fields: GetAnswerVotersFields {
48                after: None,
49                answer_id,
50                channel_id,
51                limit: None,
52                message_id,
53            },
54            http,
55        }
56    }
57
58    /// Set the user ID to get voters after.
59    pub fn after(mut self, after: Id<UserMarker>) -> Self {
60        self.fields.after.replace(after);
61
62        self
63    }
64
65    /// Set the limit of voters to get.
66    ///
67    /// The minimum is 1 and the maximum is 100.
68    pub fn limit(mut self, limit: u8) -> Self {
69        self.fields.limit.replace(limit);
70
71        self
72    }
73}
74
75impl IntoFuture for GetAnswerVoters<'_> {
76    type Output = Result<Response<GetAnswerVotersResponse>, Error>;
77    type IntoFuture = ResponseFuture<GetAnswerVotersResponse>;
78
79    fn into_future(self) -> Self::IntoFuture {
80        let http = self.http;
81
82        match self.try_into_request() {
83            Ok(request) => http.request(request),
84            Err(source) => ResponseFuture::error(source),
85        }
86    }
87}
88
89impl TryIntoRequest for GetAnswerVoters<'_> {
90    fn try_into_request(self) -> Result<Request, Error> {
91        Ok(Request::from_route(&Route::GetAnswerVoters {
92            after: self.fields.after.map(Id::get),
93            answer_id: self.fields.answer_id,
94            channel_id: self.fields.channel_id.get(),
95            limit: self.fields.limit,
96            message_id: self.fields.message_id.get(),
97        }))
98    }
99}