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