twilight_http/request/channel/reaction/
delete_reaction.rs1use 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
15pub(crate) enum TargetUser {
17 Current,
19 Id(Id<UserMarker>),
21}
22
23#[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}