Skip to content

Commit

Permalink
refactor!: move RequestReactionType to model
Browse files Browse the repository at this point in the history
  • Loading branch information
vilgotf committed Feb 26, 2023
1 parent 18fad87 commit fb1cd56
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 155 deletions.
10 changes: 5 additions & 5 deletions twilight-http/src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use crate::{
},
reaction::{
delete_reaction::TargetUser, CreateReaction, DeleteAllReaction, DeleteAllReactions,
DeleteReaction, GetReactions, RequestReactionType,
DeleteReaction, GetReactions,
},
stage::{
CreateStageInstance, DeleteStageInstance, GetStageInstance, UpdateStageInstance,
Expand Down Expand Up @@ -101,7 +101,7 @@ use twilight_http_ratelimiting::Ratelimiter;
use twilight_model::{
channel::{message::AllowedMentions, ChannelType},
guild::{auto_moderation::AutoModerationEventType, scheduled_event::PrivacyLevel, MfaLevel},
http::permission_overwrite::PermissionOverwrite,
http::{permission_overwrite::PermissionOverwrite, RequestReactionType},
id::{
marker::{
ApplicationMarker, AutoModerationRuleMarker, ChannelMarker, EmojiMarker, GuildMarker,
Expand Down Expand Up @@ -2582,7 +2582,7 @@ impl Client {
let url = format!("{protocol}://{host}/api/v{API_VERSION}/{path}");
tracing::debug!(?url);

let mut builder = hyper::Request::builder().method(method.to_http()).uri(&url);
let mut builder = hyper::Request::builder().method(method.name()).uri(&url);

if use_authorization_token {
if let Some(token) = self.token.as_deref() {
Expand Down Expand Up @@ -2658,9 +2658,9 @@ impl Client {
.flatten();

Ok(if let Some(ratelimiter) = &self.ratelimiter {
let tx_future = ratelimiter.wait_for_ticket(ratelimit_path);
let rx = ratelimiter.permit(ratelimit_path);

ResponseFuture::ratelimit(invalid_token, inner, self.timeout, tx_future)
ResponseFuture::ratelimit(invalid_token, inner, self.timeout, rx)
} else {
ResponseFuture::new(Box::pin(time::timeout(self.timeout, inner)), invalid_token)
})
Expand Down
14 changes: 8 additions & 6 deletions twilight-http/src/request/channel/reaction/create_reaction.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use super::RequestReactionType;
use crate::{
client::Client,
error::Error,
Expand All @@ -7,9 +6,12 @@ use crate::{
routing::Route,
};
use std::future::IntoFuture;
use twilight_model::id::{
marker::{ChannelMarker, MessageMarker},
Id,
use twilight_model::{
http::RequestReactionType,
id::{
marker::{ChannelMarker, MessageMarker},
Id,
},
};

/// Create a reaction in a [`Id<ChannelMarker>`] on a [`Id<MessageMarker>`].
Expand Down Expand Up @@ -89,12 +91,12 @@ mod tests {

use super::CreateReaction;
use crate::{
request::{channel::reaction::RequestReactionType, Request, TryIntoRequest},
request::{Request, TryIntoRequest},
routing::Route,
Client,
};
use std::error::Error;
use twilight_model::id::Id;
use twilight_model::{http::RequestReactionType, id::Id};

#[test]
fn request() -> Result<(), Box<dyn Error>> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use super::RequestReactionType;
use crate::{
client::Client,
error::Error,
Expand All @@ -7,9 +6,12 @@ use crate::{
routing::Route,
};
use std::future::IntoFuture;
use twilight_model::id::{
marker::{ChannelMarker, MessageMarker},
Id,
use twilight_model::{
http::RequestReactionType,
id::{
marker::{ChannelMarker, MessageMarker},
Id,
},
};

/// Remove all reactions of a specified emoji from a message.
Expand Down
10 changes: 6 additions & 4 deletions twilight-http/src/request/channel/reaction/delete_reaction.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use super::RequestReactionType;
use crate::{
client::Client,
error::Error,
Expand All @@ -7,9 +6,12 @@ use crate::{
routing::Route,
};
use std::future::IntoFuture;
use twilight_model::id::{
marker::{ChannelMarker, MessageMarker, UserMarker},
Id,
use twilight_model::{
http::RequestReactionType,
id::{
marker::{ChannelMarker, MessageMarker, UserMarker},
Id,
},
};

/// User to delete the reaction of.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use super::RequestReactionType;
use crate::{
client::Client,
error::Error,
Expand All @@ -8,6 +7,7 @@ use crate::{
};
use std::future::IntoFuture;
use twilight_model::{
http::RequestReactionType,
id::{
marker::{ChannelMarker, MessageMarker, UserMarker},
Id,
Expand Down
130 changes: 0 additions & 130 deletions twilight-http/src/request/channel/reaction/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,133 +10,3 @@ pub use self::{
delete_all_reactions::DeleteAllReactions, delete_reaction::DeleteReaction,
get_reactions::GetReactions,
};
use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
use std::fmt::{Display, Formatter, Result as FmtResult};
use twilight_model::id::{marker::EmojiMarker, Id};

/// Handle a reaction of either a custom or unicode emoji.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum RequestReactionType<'a> {
/// Reaction of a custom emoji.
Custom {
/// ID of the custom emoji.
id: Id<EmojiMarker>,
/// Name of the custom emoji.
///
/// This is not strictly required, but may be helpful for Discord to
/// work with.
name: Option<&'a str>,
},
/// Reaction of a unicode emoji, such as "🌈".
Unicode {
/// Unicode emoji.
name: &'a str,
},
}

/// Format a [`RequestReactionType`] into a format acceptable for use in URLs.
///
/// # Examples
///
/// Format a custom reaction for use in a URL:
///
/// ```
/// use twilight_http::request::channel::reaction::RequestReactionType;
/// use twilight_model::id::Id;
///
/// let reaction = RequestReactionType::Custom {
/// id: Id::new(123),
/// name: Some("rarity"),
/// };
///
/// assert_eq!("rarity:123", reaction.to_string());
/// ```
///
/// Format the transgeneder flag for use in a URL:
///
/// ```
/// use twilight_http::request::channel::reaction::RequestReactionType;
///
/// let reaction = RequestReactionType::Unicode {
/// name: "🏳️‍⚧️"
/// };
///
/// assert_eq!(
/// "%F0%9F%8F%B3%EF%B8%8F%E2%80%8D%E2%9A%A7%EF%B8%8F",
/// reaction.to_string(),
/// );
/// ```
impl Display for RequestReactionType<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
match self {
RequestReactionType::Custom { id, name } => {
if let Some(name) = name {
f.write_str(name)?;
} else {
f.write_str("e")?;
}

f.write_str(":")?;

Display::fmt(id, f)
}
RequestReactionType::Unicode { name } => {
Display::fmt(&utf8_percent_encode(name, NON_ALPHANUMERIC), f)
}
}
}
}

#[cfg(test)]
mod tests {
// `clippy::non_ascii_literal` can't be allowed on an item level; it can
// only be enabled on a module level.
#![allow(clippy::non_ascii_literal)]

use super::RequestReactionType;
use static_assertions::{assert_fields, assert_impl_all};
use std::{
fmt::{Debug, Display},
hash::Hash,
};
use twilight_model::id::Id;

assert_fields!(RequestReactionType::Custom: id, name);
assert_fields!(RequestReactionType::Unicode: name);
assert_impl_all!(RequestReactionType<'_>: Clone, Copy, Debug, Display, Eq, Hash, PartialEq, Send, Sync);

#[test]
fn display_custom_with_name() {
let reaction = RequestReactionType::Custom {
id: Id::new(123),
name: Some("foo"),
};

assert_eq!("foo:123", reaction.to_string());
}

#[test]
fn display_custom_without_name() {
let reaction = RequestReactionType::Custom {
id: Id::new(123),
name: None,
};

assert_eq!("e:123", reaction.to_string());
}

/// Test that unicode reactions format with percent encoding.
// We can't use the actual flag here
#[test]
fn display_unicode() {
let reaction = RequestReactionType::Unicode {
// Rainbow flag 🏳️‍🌈
name: "🏳️‍🌈",
};

assert_eq!(
"%F0%9F%8F%B3%EF%B8%8F%E2%80%8D%F0%9F%8C%88",
reaction.to_string()
);
}
}
12 changes: 7 additions & 5 deletions twilight-http/src/routing.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
pub use twilight_http_ratelimiting::request::{Path, PathParseError, PathParseErrorType};

use crate::request::{channel::reaction::RequestReactionType, Method};
use crate::request::Method;
use std::fmt::{Display, Formatter, Result as FmtResult};
use twilight_model::id::{marker::RoleMarker, Id};
use twilight_model::{
http::RequestReactionType,
id::{marker::RoleMarker, Id},
};

#[derive(Clone, Debug, Eq, Hash, PartialEq)]
#[non_exhaustive]
Expand Down Expand Up @@ -2905,8 +2908,8 @@ impl Display for Route<'_> {
#[cfg(test)]
mod tests {
use super::Route;
use crate::request::{channel::reaction::RequestReactionType, Method};
use twilight_model::id::Id;
use crate::request::Method;
use twilight_model::{http::RequestReactionType, id::Id};

/// Test a route for each method.
#[test]
Expand Down Expand Up @@ -2967,7 +2970,6 @@ mod tests {
const fn emoji() -> RequestReactionType<'static> {
RequestReactionType::Custom {
id: Id::new(EMOJI_ID),
name: None,
}
}

Expand Down
1 change: 1 addition & 0 deletions twilight-model/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ version = "0.15.0"

[dependencies]
bitflags = { default-features = false, version = "1" }
percent-encoding = { default-features = false, version = "2" }
serde = { default-features = false, features = ["derive", "std"], version = "1.0.103" }
serde-value = { default-features = false, version = "0.7" }
serde_repr = { default-features = false, version = "0.1.5" }
Expand Down
4 changes: 4 additions & 0 deletions twilight-model/src/http/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@
pub mod attachment;
pub mod interaction;
pub mod permission_overwrite;

mod reaction_type;

pub use self::reaction_type::RequestReactionType;
Loading

0 comments on commit fb1cd56

Please sign in to comment.