Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor!: move RequestReactionType to model #2162

Draft
wants to merge 4 commits into
base: next
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 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 @@ -1530,8 +1530,8 @@ impl Client {
///
/// # Examples
/// ```no_run
/// # use twilight_http::{Client, request::channel::reaction::RequestReactionType};
/// # use twilight_model::id::Id;
/// # use twilight_http::Client;
/// # use twilight_model::{http::RequestReactionType, id::Id};
/// #
/// # #[tokio::main]
/// # async fn main() -> Result<(), Box<dyn std::error::Error>> {
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
131 changes: 2 additions & 129 deletions twilight-http/src/request/channel/reaction/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,133 +10,6 @@ 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()
);
}
}
#[deprecated(since = "0.16.0", note = "moved to twilight_model::http")]
pub use twilight_model::http::RequestReactionType;
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