From 9450d4b55e824bd841577f7bb58f9916d98b9c09 Mon Sep 17 00:00:00 2001 From: acdenisSK Date: Sun, 19 May 2019 18:15:07 +0200 Subject: [PATCH] Eliminate `VecMap` This was made for performance gains in the past, but with the recent transition of the standard library HashMap to a Swiss-table implementation, it no longer suits a purpose. --- src/builder/create_embed.rs | 26 +++--- src/builder/create_invite.rs | 6 +- src/builder/create_message.rs | 10 ++- src/builder/edit_channel.rs | 4 +- src/builder/edit_guild.rs | 4 +- src/builder/edit_member.rs | 4 +- src/builder/edit_message.rs | 8 +- src/builder/edit_profile.rs | 4 +- src/builder/edit_role.rs | 6 +- src/builder/execute_webhook.rs | 6 +- src/builder/get_messages.rs | 4 +- src/model/channel/channel_category.rs | 8 +- src/model/channel/channel_id.rs | 8 +- src/model/channel/embed.rs | 2 +- src/model/channel/guild_channel.rs | 12 ++- src/model/channel/message.rs | 2 +- src/model/guild/guild_id.rs | 8 +- src/model/guild/member.rs | 6 +- src/model/invite.rs | 2 +- src/model/user.rs | 6 +- src/model/webhook.rs | 2 +- src/utils/mod.rs | 13 --- src/utils/vec_map.rs | 120 -------------------------- 23 files changed, 73 insertions(+), 198 deletions(-) delete mode 100644 src/utils/vec_map.rs diff --git a/src/builder/create_embed.rs b/src/builder/create_embed.rs index 6ea945a02a1..6f7cbd6b05a 100644 --- a/src/builder/create_embed.rs +++ b/src/builder/create_embed.rs @@ -15,11 +15,15 @@ //! [`ExecuteWebhook::embeds`]: struct.ExecuteWebhook.html#method.embeds //! [here]: https://discordapp.com/developers/docs/resources/channel#embed-object -use chrono::{DateTime, TimeZone}; use crate::internal::prelude::*; use crate::model::channel::Embed; +use crate::utils; + +use chrono::{DateTime, TimeZone}; use serde_json::{json, Value}; -use crate::utils::{self, VecMap}; + +use std::fmt::Display; +use std::collections::HashMap; #[cfg(feature = "utils")] use crate::utils::Colour; @@ -36,7 +40,7 @@ use crate::utils::Colour; /// [`Embed`]: ../model/channel/struct.Embed.html /// [`ExecuteWebhook::embeds`]: struct.ExecuteWebhook.html#method.embeds #[derive(Clone, Debug)] -pub struct CreateEmbed(pub VecMap<&'static str, Value>); +pub struct CreateEmbed(pub HashMap<&'static str, Value>); impl CreateEmbed { /// Set the author of the embed. @@ -50,7 +54,7 @@ impl CreateEmbed { let mut author = CreateEmbedAuthor::default(); f(&mut author); - let map = utils::vecmap_to_json_map(author.0); + let map = utils::hashmap_to_json_map(author.0); self.0.insert("author", Value::Object(map)); self @@ -167,7 +171,7 @@ impl CreateEmbed { let mut create_embed_footer = CreateEmbedFooter::default(); f(&mut create_embed_footer); let footer = create_embed_footer.0; - let map = utils::vecmap_to_json_map(footer); + let map = utils::hashmap_to_json_map(footer); self.0.insert("footer", Value::Object(map)); self @@ -333,7 +337,9 @@ impl CreateEmbed { /// [`image`]: #method.image #[inline] pub fn attachment(&mut self, filename: S) -> &mut Self { - self.image(format_args!("attachment://{}", filename)); + let mut filename = filename.to_string(); + filename.insert_str(0, "attachment://"); + self.url_object("image", filename); self } @@ -342,7 +348,7 @@ impl CreateEmbed { impl Default for CreateEmbed { /// Creates a builder with default values, setting the `type` to `rich`. fn default() -> CreateEmbed { - let mut map = VecMap::new(); + let mut map = HashMap::new(); map.insert("type", Value::String("rich".to_string())); CreateEmbed(map) @@ -426,7 +432,7 @@ impl From for CreateEmbed { /// [`CreateEmbed::author`]: struct.CreateEmbed.html#method.author /// [`name`]: #method.name #[derive(Clone, Debug, Default)] -pub struct CreateEmbedAuthor(pub VecMap<&'static str, Value>); +pub struct CreateEmbedAuthor(pub HashMap<&'static str, Value>); impl CreateEmbedAuthor { /// Set the URL of the author's icon. @@ -456,7 +462,7 @@ impl CreateEmbedAuthor { /// [`Embed`]: ../model/channel/struct.Embed.html /// [`CreateEmbed::footer`]: struct.CreateEmbed.html#method.footer #[derive(Clone, Debug, Default)] -pub struct CreateEmbedFooter(pub VecMap<&'static str, Value>); +pub struct CreateEmbedFooter(pub HashMap<&'static str, Value>); impl CreateEmbedFooter { /// Set the icon URL's value. This only supports HTTP(S). @@ -558,7 +564,7 @@ mod test { builder.title("still a hakase"); builder.url("https://i.imgur.com/XfWpfCV.gif"); - let built = Value::Object(utils::vecmap_to_json_map(builder.0)); + let built = Value::Object(utils::hashmap_to_json_map(builder.0)); let obj = json!({ "color": 0xFF0011, diff --git a/src/builder/create_invite.rs b/src/builder/create_invite.rs index 2cc05915fe8..d8edc9f1147 100644 --- a/src/builder/create_invite.rs +++ b/src/builder/create_invite.rs @@ -1,5 +1,5 @@ use crate::internal::prelude::*; -use crate::utils::VecMap; +use std::collections::HashMap; use serde_json::Value; /// A builder to create a [`RichInvite`] for use via [`GuildChannel::create_invite`]. @@ -67,7 +67,7 @@ use serde_json::Value; /// [`GuildChannel::create_invite`]: ../model/channel/struct.GuildChannel.html#method.create_invite /// [`RichInvite`]: ../model/invite/struct.RichInvite.html #[derive(Clone, Debug)] -pub struct CreateInvite(pub VecMap<&'static str, Value>); +pub struct CreateInvite(pub HashMap<&'static str, Value>); impl CreateInvite { /// The duration that the invite will be valid for. @@ -226,7 +226,7 @@ impl Default for CreateInvite { /// let invite_builder = CreateInvite::default(); /// ``` fn default() -> CreateInvite { - let mut map = VecMap::new(); + let mut map = HashMap::new(); map.insert("validate", Value::Null); CreateInvite(map) diff --git a/src/builder/create_message.rs b/src/builder/create_message.rs index c9723814a44..0f46ae7d303 100644 --- a/src/builder/create_message.rs +++ b/src/builder/create_message.rs @@ -2,7 +2,9 @@ use crate::internal::prelude::*; use crate::http::AttachmentType; use crate::model::channel::ReactionType; use super::CreateEmbed; -use crate::utils::{self, VecMap}; +use crate::utils; + +use std::collections::HashMap; /// A builder to specify the contents of an [`http::send_message`] request, /// primarily meant for use through [`ChannelId::send_message`]. @@ -51,7 +53,7 @@ use crate::utils::{self, VecMap}; /// [`embed`]: #method.embed /// [`http::send_message`]: ../http/fn.send_message.html #[derive(Clone, Debug)] -pub struct CreateMessage<'a>(pub VecMap<&'static str, Value>, pub Option>, pub Vec>); +pub struct CreateMessage<'a>(pub HashMap<&'static str, Value>, pub Option>, pub Vec>); impl<'a> CreateMessage<'a> { /// Set the content of the message. @@ -72,7 +74,7 @@ impl<'a> CreateMessage<'a> { where F: FnOnce(&mut CreateEmbed) -> &mut CreateEmbed { let mut embed = CreateEmbed::default(); f(&mut embed); - let map = utils::vecmap_to_json_map(embed.0); + let map = utils::hashmap_to_json_map(embed.0); let embed = Value::Object(map); self.0.insert("embed", embed); @@ -129,7 +131,7 @@ impl<'a> Default for CreateMessage<'a> { /// [`Message`]: ../model/channel/struct.Message.html /// [`tts`]: #method.tts fn default() -> CreateMessage<'a> { - let mut map = VecMap::new(); + let mut map = HashMap::new(); map.insert("tts", Value::Bool(false)); CreateMessage(map, None, Vec::new()) diff --git a/src/builder/edit_channel.rs b/src/builder/edit_channel.rs index d1b94be4b44..d4a0c64db8d 100644 --- a/src/builder/edit_channel.rs +++ b/src/builder/edit_channel.rs @@ -1,6 +1,6 @@ use crate::internal::prelude::*; -use crate::utils::VecMap; use crate::model::id::ChannelId; +use std::collections::HashMap; /// A builder to edit a [`GuildChannel`] for use via [`GuildChannel::edit`] /// @@ -20,7 +20,7 @@ use crate::model::id::ChannelId; /// [`GuildChannel`]: ../model/channel/struct.GuildChannel.html /// [`GuildChannel::edit`]: ../model/channel/struct.GuildChannel.html#method.edit #[derive(Clone, Debug, Default)] -pub struct EditChannel(pub VecMap<&'static str, Value>); +pub struct EditChannel(pub HashMap<&'static str, Value>); impl EditChannel { /// The bitrate of the channel in bits. diff --git a/src/builder/edit_guild.rs b/src/builder/edit_guild.rs index a59498e173c..332c93a98c0 100644 --- a/src/builder/edit_guild.rs +++ b/src/builder/edit_guild.rs @@ -1,6 +1,6 @@ use crate::internal::prelude::*; use crate::model::prelude::*; -use crate::utils::VecMap; +use std::collections::HashMap; /// A builder to optionally edit certain fields of a [`Guild`]. This is meant /// for usage with [`Guild::edit`]. @@ -12,7 +12,7 @@ use crate::utils::VecMap; /// [`Guild`]: ../model/guild/struct.Guild.html /// [Manage Guild]: ../model/permissions/struct.Permissions.html#associatedconstant.MANAGE_GUILD #[derive(Clone, Debug, Default)] -pub struct EditGuild(pub VecMap<&'static str, Value>); +pub struct EditGuild(pub HashMap<&'static str, Value>); impl EditGuild { /// Set the "AFK voice channel" that users are to move to if they have been diff --git a/src/builder/edit_member.rs b/src/builder/edit_member.rs index 29deb593be6..fad964e53e6 100644 --- a/src/builder/edit_member.rs +++ b/src/builder/edit_member.rs @@ -1,6 +1,6 @@ use crate::internal::prelude::*; use crate::model::id::{ChannelId, RoleId}; -use crate::utils::VecMap; +use std::collections::HashMap; /// A builder which edits the properties of a [`Member`], to be used in /// conjunction with [`Member::edit`]. @@ -8,7 +8,7 @@ use crate::utils::VecMap; /// [`Member`]: ../model/guild/struct.Member.html /// [`Member::edit`]: ../model/guild/struct.Member.html#method.edit #[derive(Clone, Debug, Default)] -pub struct EditMember(pub VecMap<&'static str, Value>); +pub struct EditMember(pub HashMap<&'static str, Value>); impl EditMember { /// Whether to deafen the member. diff --git a/src/builder/edit_message.rs b/src/builder/edit_message.rs index b49800c7103..e4ee8e143eb 100644 --- a/src/builder/edit_message.rs +++ b/src/builder/edit_message.rs @@ -1,6 +1,8 @@ use crate::internal::prelude::*; use super::CreateEmbed; -use crate::utils::{self, VecMap}; +use crate::utils; + +use std::collections::HashMap; /// A builder to specify the fields to edit in an existing message. /// @@ -30,7 +32,7 @@ use crate::utils::{self, VecMap}; /// /// [`Message`]: ../model/channel/struct.Message.html #[derive(Clone, Debug, Default)] -pub struct EditMessage(pub VecMap<&'static str, Value>); +pub struct EditMessage(pub HashMap<&'static str, Value>); impl EditMessage { /// Set the content of the message. @@ -47,7 +49,7 @@ impl EditMessage { where F: FnOnce(&mut CreateEmbed) -> &mut CreateEmbed { let mut create_embed = CreateEmbed::default(); f(&mut create_embed); - let map = utils::vecmap_to_json_map(create_embed.0); + let map = utils::hashmap_to_json_map(create_embed.0); let embed = Value::Object(map); self.0.insert("embed", embed); diff --git a/src/builder/edit_profile.rs b/src/builder/edit_profile.rs index 289af112dad..653a6cefa0a 100644 --- a/src/builder/edit_profile.rs +++ b/src/builder/edit_profile.rs @@ -1,12 +1,12 @@ use crate::internal::prelude::*; -use crate::utils::VecMap; +use std::collections::HashMap; /// A builder to edit the current user's settings, to be used in conjunction /// with [`CurrentUser::edit`]. /// /// [`CurrentUser::edit`]: ../model/user/struct.CurrentUser.html#method.edit #[derive(Clone, Debug, Default)] -pub struct EditProfile(pub VecMap<&'static str, Value>); +pub struct EditProfile(pub HashMap<&'static str, Value>); impl EditProfile { /// Sets the avatar of the current user. `None` can be passed to remove an diff --git a/src/builder/edit_role.rs b/src/builder/edit_role.rs index 8470f860857..859e2a29238 100644 --- a/src/builder/edit_role.rs +++ b/src/builder/edit_role.rs @@ -3,7 +3,7 @@ use crate::model::{ guild::Role, Permissions }; -use crate::utils::VecMap; +use std::collections::HashMap; /// A builder to create or edit a [`Role`] for use via a number of model methods. /// @@ -44,14 +44,14 @@ use crate::utils::VecMap; /// [`Role`]: ../model/guild/struct.Role.html /// [`Role::edit`]: ../model/guild/struct.Role.html#method.edit #[derive(Clone, Debug, Default)] -pub struct EditRole(pub VecMap<&'static str, Value>); +pub struct EditRole(pub HashMap<&'static str, Value>); impl EditRole { /// Creates a new builder with the values of the given [`Role`]. /// /// [`Role`]: ../model/guild/struct.Role.html pub fn new(role: &Role) -> Self { - let mut map = VecMap::with_capacity(8); + let mut map = HashMap::with_capacity(8); #[cfg(feature = "utils")] { diff --git a/src/builder/execute_webhook.rs b/src/builder/execute_webhook.rs index b050bfcd325..3422db95248 100644 --- a/src/builder/execute_webhook.rs +++ b/src/builder/execute_webhook.rs @@ -1,5 +1,5 @@ use serde_json::Value; -use crate::utils::VecMap; +use std::collections::HashMap; /// A builder to create the inner content of a [`Webhook`]'s execution. /// @@ -48,7 +48,7 @@ use crate::utils::VecMap; /// [`Webhook::execute`]: ../model/webhook/struct.Webhook.html#method.execute /// [`execute_webhook`]: ../http/raw/struct.Http.html#method.execute_webhook #[derive(Clone, Debug)] -pub struct ExecuteWebhook(pub VecMap<&'static str, Value>); +pub struct ExecuteWebhook(pub HashMap<&'static str, Value>); impl ExecuteWebhook { /// Override the default avatar of the webhook with an image URL. @@ -195,7 +195,7 @@ impl Default for ExecuteWebhook { /// [`Webhook`]: ../model/webhook/struct.Webhook.html /// [`tts`]: #method.tts fn default() -> ExecuteWebhook { - let mut map = VecMap::new(); + let mut map = HashMap::new(); map.insert("tts", Value::Bool(false)); ExecuteWebhook(map) diff --git a/src/builder/get_messages.rs b/src/builder/get_messages.rs index 879ebc7f414..01f37a3effe 100644 --- a/src/builder/get_messages.rs +++ b/src/builder/get_messages.rs @@ -1,5 +1,5 @@ use crate::model::id::MessageId; -use crate::utils::VecMap; +use std::collections::HashMap; /// Builds a request for a request to the API to retrieve messages. /// @@ -48,7 +48,7 @@ use crate::utils::VecMap; /// /// [`GuildChannel::messages`]: ../model/channel/struct.GuildChannel.html#method.messages #[derive(Clone, Debug, Default)] -pub struct GetMessages(pub VecMap<&'static str, u64>); +pub struct GetMessages(pub HashMap<&'static str, u64>); impl GetMessages { /// Indicates to retrieve the messages after a specific message, given by diff --git a/src/model/channel/channel_category.rs b/src/model/channel/channel_category.rs index e978ffe09ac..6df28c6d007 100644 --- a/src/model/channel/channel_category.rs +++ b/src/model/channel/channel_category.rs @@ -1,11 +1,11 @@ -use crate::{model::prelude::*}; +use crate::model::prelude::*; #[cfg(feature = "client")] use crate::client::Context; #[cfg(all(feature = "builder", feature = "model"))] use crate::builder::EditChannel; #[cfg(all(feature = "model", feature = "utils"))] -use crate::utils::{self as serenity_utils, VecMap}; +use crate::utils as serenity_utils; #[cfg(feature = "http")] use crate::http::Http; @@ -102,14 +102,14 @@ impl ChannelCategory { } } - let mut map = VecMap::new(); + let mut map = HashMap::new(); map.insert("name", Value::String(self.name.clone())); map.insert("position", Value::Number(Number::from(self.position))); let mut edit_channel = EditChannel::default(); f(&mut edit_channel); - let map = serenity_utils::vecmap_to_json_map(edit_channel.0); + let map = serenity_utils::hashmap_to_json_map(edit_channel.0); context.http.edit_channel(self.id.0, &map).map(|channel| { let GuildChannel { diff --git a/src/model/channel/channel_id.rs b/src/model/channel/channel_id.rs index aafc7d82511..3480a5a5789 100644 --- a/src/model/channel/channel_id.rs +++ b/src/model/channel/channel_id.rs @@ -262,7 +262,7 @@ impl ChannelId { let mut channel = EditChannel::default(); f(&mut channel); - let map = utils::vecmap_to_json_map(channel.0); + let map = utils::hashmap_to_json_map(channel.0); http.as_ref().edit_channel(self.0, &map) } @@ -306,7 +306,7 @@ impl ChannelId { } } - let map = utils::vecmap_to_json_map(msg.0); + let map = utils::hashmap_to_json_map(msg.0); http.as_ref().edit_message(self.0, message_id.0, &Value::Object(map)) } @@ -617,7 +617,7 @@ impl ChannelId { msg.0.insert("payload_json", json!({ "embed": e })); } - let map = utils::vecmap_to_json_map(msg.0.clone()); + let map = utils::hashmap_to_json_map(msg.0.clone()); http.as_ref().send_files(self.0, files, map) } @@ -652,7 +652,7 @@ impl ChannelId { } } - let map = utils::vecmap_to_json_map(msg.0.clone()); + let map = utils::hashmap_to_json_map(msg.0.clone()); Message::check_content_length(&map)?; Message::check_embed_length(&map)?; diff --git a/src/model/channel/embed.rs b/src/model/channel/embed.rs index 9a7bda47540..35a8e4e95ae 100644 --- a/src/model/channel/embed.rs +++ b/src/model/channel/embed.rs @@ -95,7 +95,7 @@ impl Embed { where F: FnOnce(&mut CreateEmbed) -> &mut CreateEmbed { let mut create_embed = CreateEmbed::default(); f(&mut create_embed); - let map = utils::vecmap_to_json_map(create_embed.0); + let map = utils::hashmap_to_json_map(create_embed.0); Value::Object(map) } diff --git a/src/model/channel/guild_channel.rs b/src/model/channel/guild_channel.rs index 3cd54eac5a5..cc6bcbfb11e 100644 --- a/src/model/channel/guild_channel.rs +++ b/src/model/channel/guild_channel.rs @@ -1,5 +1,5 @@ use chrono::{DateTime, FixedOffset}; -use crate::{model::prelude::*}; +use crate::model::prelude::*; #[cfg(feature = "client")] use crate::client::Context; @@ -27,7 +27,7 @@ use std::fmt::{ Result as FmtResult }; #[cfg(all(feature = "model", feature = "utils"))] -use crate::utils::{self as serenity_utils}; +use crate::utils as serenity_utils; #[cfg(all(feature = "model", feature = "builder"))] use crate::builder::EditChannel; #[cfg(feature = "http")] @@ -146,7 +146,7 @@ impl GuildChannel { let mut invite = CreateInvite::default(); f(&mut invite); - let map = serenity_utils::vecmap_to_json_map(invite.0); + let map = serenity_utils::hashmap_to_json_map(invite.0); context.http.create_invite(self.id.0, &map) } @@ -363,15 +363,13 @@ impl GuildChannel { } } - use serenity_utils::VecMap; - - let mut map = VecMap::new(); + let mut map = HashMap::new(); map.insert("name", Value::String(self.name.clone())); map.insert("position", Value::Number(Number::from(self.position))); let mut edit_channel = EditChannel::default(); f(&mut edit_channel); - let edited = serenity_utils::vecmap_to_json_map(edit_channel.0); + let edited = serenity_utils::hashmap_to_json_map(edit_channel.0); match context.http.edit_channel(self.id.0, &edited) { Ok(channel) => { diff --git a/src/model/channel/message.rs b/src/model/channel/message.rs index a11d4297ed8..9022f351416 100644 --- a/src/model/channel/message.rs +++ b/src/model/channel/message.rs @@ -212,7 +212,7 @@ impl Message { f(&mut builder); - let map = serenity_utils::vecmap_to_json_map(builder.0); + let map = serenity_utils::hashmap_to_json_map(builder.0); match context.http.edit_message(self.channel_id.0, self.id.0, &Value::Object(map)) { Ok(edited) => { diff --git a/src/model/guild/guild_id.rs b/src/model/guild/guild_id.rs index 3bbe07e72f7..ac0915a9756 100644 --- a/src/model/guild/guild_id.rs +++ b/src/model/guild/guild_id.rs @@ -214,7 +214,7 @@ impl GuildId { where F: FnOnce(&mut EditRole) -> &mut EditRole { let mut edit_role = EditRole::default(); f(&mut edit_role); - let map = utils::vecmap_to_json_map(edit_role.0); + let map = utils::hashmap_to_json_map(edit_role.0); let role = http.as_ref().create_role(self.0, &map)?; @@ -305,7 +305,7 @@ impl GuildId { where F: FnOnce(&mut EditGuild) -> &mut EditGuild{ let mut edit_guild = EditGuild::default(); f(&mut edit_guild); - let map = utils::vecmap_to_json_map(edit_guild.0); + let map = utils::hashmap_to_json_map(edit_guild.0); http.as_ref().edit_guild(self.0, &map) } @@ -359,7 +359,7 @@ impl GuildId { where F: FnOnce(&mut EditMember) -> &mut EditMember { let mut edit_member = EditMember::default(); f(&mut edit_member); - let map = utils::vecmap_to_json_map(edit_member.0); + let map = utils::hashmap_to_json_map(edit_member.0); http.as_ref().edit_member(self.0, user_id.0, &map) } @@ -405,7 +405,7 @@ impl GuildId { where F: FnOnce(&mut EditRole) -> &mut EditRole { let mut edit_role = EditRole::default(); f(&mut edit_role); - let map = utils::vecmap_to_json_map(edit_role.0); + let map = utils::hashmap_to_json_map(edit_role.0); http.as_ref().edit_role(self.0, role_id.0, &map) } diff --git a/src/model/guild/member.rs b/src/model/guild/member.rs index 7325f8e2e36..3a6e0b0a357 100644 --- a/src/model/guild/member.rs +++ b/src/model/guild/member.rs @@ -123,7 +123,7 @@ impl Member { let mut builder = EditMember::default(); builder.roles(&self.roles); - let map = utils::vecmap_to_json_map(builder.0); + let map = utils::hashmap_to_json_map(builder.0); match http.as_ref().edit_member(self.guild_id.0, self.user.read().id.0, &map) { Ok(()) => Ok(()), @@ -245,7 +245,7 @@ impl Member { pub fn edit &mut EditMember>(&self, http: impl AsRef, f: F) -> Result<()> { let mut edit_member = EditMember::default(); f(&mut edit_member); - let map = utils::vecmap_to_json_map(edit_member.0); + let map = utils::hashmap_to_json_map(edit_member.0); http.as_ref().edit_member(self.guild_id.0, self.user.read().id.0, &map) } @@ -415,7 +415,7 @@ impl Member { let mut builder = EditMember::default(); builder.roles(&self.roles); - let map = utils::vecmap_to_json_map(builder.0); + let map = utils::hashmap_to_json_map(builder.0); match http.as_ref().edit_member(self.guild_id.0, self.user.read().id.0, &map) { Ok(()) => Ok(()), diff --git a/src/model/invite.rs b/src/model/invite.rs index 62da58c5a6a..35adb5c0d1c 100644 --- a/src/model/invite.rs +++ b/src/model/invite.rs @@ -94,7 +94,7 @@ impl Invite { } } - let map = utils::vecmap_to_json_map(f(CreateInvite::default()).0); + let map = utils::hashmap_to_json_map(f(CreateInvite::default()).0); context.http.create_invite(channel_id.0, &map) } diff --git a/src/model/user.rs b/src/model/user.rs index ce107defa91..41623b7303f 100644 --- a/src/model/user.rs +++ b/src/model/user.rs @@ -26,7 +26,7 @@ use crate::cache::CacheRwLock; #[cfg(all(feature = "cache", feature = "model"))] use std::sync::Arc; #[cfg(feature = "model")] -use crate::utils::{self, VecMap}; +use crate::utils; #[cfg(feature = "http")] use crate::http::Http; @@ -109,7 +109,7 @@ impl CurrentUser { #[cfg(feature = "http")] pub fn edit(&mut self, http: impl AsRef, f: F) -> Result<()> where F: FnOnce(&mut EditProfile) -> &mut EditProfile { - let mut map = VecMap::new(); + let mut map = HashMap::new(); map.insert("username", Value::String(self.name.clone())); if let Some(email) = self.email.as_ref() { @@ -118,7 +118,7 @@ impl CurrentUser { let mut edit_profile = EditProfile(map); f(&mut edit_profile); - let map = utils::vecmap_to_json_map(edit_profile.0); + let map = utils::hashmap_to_json_map(edit_profile.0); match http.as_ref().edit_profile(&map) { Ok(new) => { diff --git a/src/model/webhook.rs b/src/model/webhook.rs index 0282964c545..f15ccba9751 100644 --- a/src/model/webhook.rs +++ b/src/model/webhook.rs @@ -215,7 +215,7 @@ impl Webhook { where F: FnOnce(&mut ExecuteWebhook) -> &mut ExecuteWebhook { let mut execute_webhook = ExecuteWebhook::default(); f(&mut execute_webhook); - let map = utils::vecmap_to_json_map(execute_webhook.0); + let map = utils::hashmap_to_json_map(execute_webhook.0); http.as_ref().execute_webhook(self.id.0, &self.token, wait, &map) } diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 03aaf4e9f48..23c3b99b76e 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -3,12 +3,10 @@ mod colour; mod message_builder; -mod vec_map; pub use self::{ colour::Colour, message_builder::{Content, ContentModifier, MessageBuilder}, - vec_map::VecMap }; use base64; @@ -55,17 +53,6 @@ pub fn hashmap_to_json_map(map: HashMap) json_map } -/// Converts a VecMap into a final `serde_json::Map` representation. -pub fn vecmap_to_json_map(map: VecMap) -> Map { - let mut json_map = Map::new(); - - for (key, value) in map { - json_map.insert(key.to_string(), value); - } - - json_map -} - /// Retrieves the "code" part of an invite out of a URL. /// /// # Examples diff --git a/src/utils/vec_map.rs b/src/utils/vec_map.rs deleted file mode 100644 index 1427416a752..00000000000 --- a/src/utils/vec_map.rs +++ /dev/null @@ -1,120 +0,0 @@ -// Most of this is shamelessly copied from -// - -/// Like `HashMap` but solely uses a vector instead. -/// -/// note: This is for internal use. -#[derive(Clone, Debug, Default)] -pub struct VecMap(Vec<(K, V)>); - -impl VecMap { - pub fn new() -> Self { - VecMap(Vec::new()) - } - - pub fn with_capacity(cap: usize) -> Self { - VecMap(Vec::with_capacity(cap)) - } - - #[inline] - pub fn insert(&mut self, key: K, value: V) { - self.0.push((key, value)); - } - - pub fn remove>(&mut self, key: &Q) -> Option { - self.pos(key).map(|pos| self.0.remove(pos)).map(|entry| entry.1) - } - - pub fn entry(&mut self, key: K) -> Entry<'_, K, V> { - match self.pos(&key) { - Some(pos) => Entry::Occupied(OccupiedEntry { - vec: &mut self.0, - pos, - }), - None => Entry::Vacant(VacantEntry { - vec: &mut self.0, - key, - }) - } - } - - pub fn get + ?Sized>(&self, key: &Q) -> Option<&V> { - self.iter().find(|entry| key == &entry.0).map(|entry| &entry.1) - } - - #[inline] - pub fn iter(&self) -> ::std::slice::Iter<'_, (K, V)> { - self.into_iter() - } - - fn pos + ?Sized>(&self, key: &Q) -> Option { - self.iter().position(|entry| key == &entry.0) - } -} - -impl IntoIterator for VecMap { - type Item = (K, V); - type IntoIter = ::std::vec::IntoIter<(K, V)>; - - fn into_iter(self) -> Self::IntoIter { - self.0.into_iter() - } -} - -impl<'a, K, V> IntoIterator for &'a VecMap { - type Item = &'a (K, V); - type IntoIter = ::std::slice::Iter<'a, (K, V)>; - - fn into_iter(self) -> Self::IntoIter { - self.0.iter() - } -} - -pub enum Entry<'a, K: 'a, V: 'a> { - Vacant(VacantEntry<'a, K, V>), - Occupied(OccupiedEntry<'a, K, V>) -} - -impl<'a, K, V> Entry<'a, K, V> { - pub fn or_insert(self, val: V) -> &'a mut V { - use self::Entry::*; - - match self { - Vacant(entry) => entry.insert(val), - Occupied(entry) => entry.into_mut(), - } - } - - pub fn or_insert_with V>(self, val: F) -> &'a mut V { - use self::Entry::*; - - match self { - Vacant(entry) => entry.insert(val()), - Occupied(entry) => entry.into_mut(), - } - } -} - -pub struct VacantEntry<'a, K, V> { - vec: &'a mut Vec<(K, V)>, - key: K, -} - -impl<'a, K, V> VacantEntry<'a, K, V> { - pub fn insert(self, val: V) -> &'a mut V { - self.vec.push((self.key, val)); - let pos = self.vec.len() - 1; - &mut self.vec[pos].1 - } -} - -pub struct OccupiedEntry<'a, K, V> { - vec: &'a mut Vec<(K, V)>, - pos: usize, -} - -impl<'a, K, V> OccupiedEntry<'a, K, V> { - pub fn into_mut(self) -> &'a mut V { - &mut self.vec[self.pos].1 - } -}