twilight_http/request/poll/
end_poll.rs

1use crate::{
2    client::Client,
3    error::Error,
4    request::{Request, TryIntoRequest},
5    response::{Response, ResponseFuture},
6    routing::Route,
7};
8use serde::Serialize;
9use std::future::IntoFuture;
10use twilight_model::{
11    channel::Message,
12    id::{
13        marker::{ChannelMarker, MessageMarker},
14        Id,
15    },
16};
17
18#[derive(Serialize)]
19struct EndPollFields {
20    channel_id: Id<ChannelMarker>,
21    message_id: Id<MessageMarker>,
22}
23
24// Ends a poll in a channel.
25#[must_use = "requests must be configured and executed"]
26pub struct EndPoll<'a> {
27    fields: EndPollFields,
28    http: &'a Client,
29}
30
31impl<'a> EndPoll<'a> {
32    pub(crate) const fn new(
33        http: &'a Client,
34        channel_id: Id<ChannelMarker>,
35        message_id: Id<MessageMarker>,
36    ) -> Self {
37        Self {
38            fields: EndPollFields {
39                channel_id,
40                message_id,
41            },
42            http,
43        }
44    }
45}
46
47impl IntoFuture for EndPoll<'_> {
48    type Output = Result<Response<Message>, Error>;
49    type IntoFuture = ResponseFuture<Message>;
50
51    fn into_future(self) -> Self::IntoFuture {
52        let http = self.http;
53
54        match self.try_into_request() {
55            Ok(request) => http.request(request),
56            Err(source) => ResponseFuture::error(source),
57        }
58    }
59}
60
61impl TryIntoRequest for EndPoll<'_> {
62    fn try_into_request(self) -> Result<Request, Error> {
63        Ok(Request::from_route(&Route::EndPoll {
64            channel_id: self.fields.channel_id.get(),
65            message_id: self.fields.message_id.get(),
66        }))
67    }
68}