twilight_http/request/channel/reaction/
delete_reaction.rs

1use super::RequestReactionType;
2use crate::{
3    client::Client,
4    error::Error,
5    request::{Request, TryIntoRequest},
6    response::{marker::EmptyBody, Response, ResponseFuture},
7    routing::Route,
8};
9use std::future::IntoFuture;
10use twilight_model::id::{
11    marker::{ChannelMarker, MessageMarker, UserMarker},
12    Id,
13};
14
15/// User to delete the reaction of.
16pub(crate) enum TargetUser {
17    /// Delete a reaction of the current user.
18    Current,
19    /// Delete a reaction from a user by their ID.
20    Id(Id<UserMarker>),
21}
22
23/// Delete one reaction by a user on a message.
24#[must_use = "requests must be configured and executed"]
25pub struct DeleteReaction<'a> {
26    channel_id: Id<ChannelMarker>,
27    emoji: &'a RequestReactionType<'a>,
28    http: &'a Client,
29    message_id: Id<MessageMarker>,
30    target_user: TargetUser,
31}
32
33impl<'a> DeleteReaction<'a> {
34    pub(crate) const fn new(
35        http: &'a Client,
36        channel_id: Id<ChannelMarker>,
37        message_id: Id<MessageMarker>,
38        emoji: &'a RequestReactionType<'a>,
39        target_user: TargetUser,
40    ) -> Self {
41        Self {
42            channel_id,
43            emoji,
44            http,
45            message_id,
46            target_user,
47        }
48    }
49}
50
51impl IntoFuture for DeleteReaction<'_> {
52    type Output = Result<Response<EmptyBody>, Error>;
53
54    type IntoFuture = ResponseFuture<EmptyBody>;
55
56    fn into_future(self) -> Self::IntoFuture {
57        let http = self.http;
58
59        match self.try_into_request() {
60            Ok(request) => http.request(request),
61            Err(source) => ResponseFuture::error(source),
62        }
63    }
64}
65
66impl TryIntoRequest for DeleteReaction<'_> {
67    fn try_into_request(self) -> Result<Request, Error> {
68        let route = match self.target_user {
69            TargetUser::Current => Route::DeleteReactionCurrentUser {
70                channel_id: self.channel_id.get(),
71                emoji: self.emoji,
72                message_id: self.message_id.get(),
73            },
74            TargetUser::Id(user_id) => Route::DeleteReaction {
75                channel_id: self.channel_id.get(),
76                emoji: self.emoji,
77                message_id: self.message_id.get(),
78                user_id: user_id.get(),
79            },
80        };
81
82        Ok(Request::from_route(&route))
83    }
84}