Skip to main content

twilight_http/request/channel/reaction/
delete_reaction.rs

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