diff options
| author | Ken Swenson <[email protected]> | 2018-11-25 14:13:40 -0800 |
|---|---|---|
| committer | Alex M. M <[email protected]> | 2018-11-25 23:13:40 +0100 |
| commit | 9a07cc05708e43f1f5777c353b41830bd414e5af (patch) | |
| tree | d6340432099c1daf960186be58d9449128c454bb /src/model | |
| parent | Fix links in `Event` (diff) | |
| download | serenity-9a07cc05708e43f1f5777c353b41830bd414e5af.tar.xz serenity-9a07cc05708e43f1f5777c353b41830bd414e5af.zip | |
Change all builders to mutably borrow (#443)
Diffstat (limited to 'src/model')
| -rw-r--r-- | src/model/channel/attachment.rs | 2 | ||||
| -rw-r--r-- | src/model/channel/channel_id.rs | 49 | ||||
| -rw-r--r-- | src/model/channel/embed.rs | 16 | ||||
| -rw-r--r-- | src/model/channel/group.rs | 7 | ||||
| -rw-r--r-- | src/model/channel/guild_channel.rs | 18 | ||||
| -rw-r--r-- | src/model/channel/message.rs | 12 | ||||
| -rw-r--r-- | src/model/channel/private_channel.rs | 10 | ||||
| -rw-r--r-- | src/model/guild/guild_id.rs | 14 | ||||
| -rw-r--r-- | src/model/guild/mod.rs | 4 | ||||
| -rw-r--r-- | src/model/guild/partial_guild.rs | 5 | ||||
| -rw-r--r-- | src/model/user.rs | 11 | ||||
| -rw-r--r-- | src/model/webhook.rs | 10 |
12 files changed, 89 insertions, 69 deletions
diff --git a/src/model/channel/attachment.rs b/src/model/channel/attachment.rs index 1ba256f..4fd6305 100644 --- a/src/model/channel/attachment.rs +++ b/src/model/channel/attachment.rs @@ -53,7 +53,7 @@ impl Attachment { /// struct Handler; /// /// impl EventHandler for Handler { - /// fn message(&self, _: Context, message: Message) { + /// fn message(&self, _: Context, mut message: Message) { /// for attachment in message.attachments { /// let content = match attachment.download() { /// Ok(content) => content, diff --git a/src/model/channel/channel_id.rs b/src/model/channel/channel_id.rs index 66798fa..7314594 100644 --- a/src/model/channel/channel_id.rs +++ b/src/model/channel/channel_id.rs @@ -355,8 +355,10 @@ impl ChannelId { /// [`Channel::messages`]: ../channel/enum.Channel.html#method.messages /// [Read Message History]: ../permissions/struct.Permissions.html#associatedconstant.READ_MESSAGE_HISTORY pub fn messages<F>(&self, f: F) -> Result<Vec<Message>> - where F: FnOnce(GetMessages) -> GetMessages { - let mut map = f(GetMessages::default()).0; + where F: FnOnce(&mut GetMessages) -> &mut GetMessages { + let mut get_messages = GetMessages::default(); + f(&mut get_messages); + let mut map = get_messages.0; let mut query = format!("?limit={}", map.remove(&"limit").unwrap_or(50)); if let Some(after) = map.remove(&"after") { @@ -481,11 +483,10 @@ impl ChannelId { /// [`ChannelId`]: struct.ChannelId.html /// [`ModelError::MessageTooLong`]: ../error/enum.Error.html#variant.MessageTooLong #[inline] - pub fn say<D: ::std::fmt::Display>(&self, content: D) -> Result<Message> { - self.send_message(|mut m| { - m.content(content); - - m + pub fn say<D>(&self, content: D) -> Result<Message> + where D: ::std::fmt::Display { + self.send_message(|m| { + m.content(content) }) } @@ -510,10 +511,8 @@ impl ChannelId { /// /// let paths = vec!["/path/to/file.jpg", "path/to/file2.jpg"]; /// - /// let _ = channel_id.send_files(paths, |mut m| { - /// m.content("a file"); - /// - /// m + /// let _ = channel_id.send_files(paths, |m| { + /// m.content("a file") /// }); /// ``` /// @@ -530,10 +529,8 @@ impl ChannelId { /// /// let files = vec![(&f1, "my_file.jpg"), (&f2, "my_file2.jpg")]; /// - /// let _ = channel_id.send_files(files, |mut m| { - /// m.content("a file"); - /// - /// m + /// let _ = channel_id.send_files(files, |m| { + /// m.content("a file") /// }); /// ``` /// @@ -554,9 +551,12 @@ impl ChannelId { /// [Attach Files]: ../permissions/struct.Permissions.html#associatedconstant.ATTACH_FILES /// [Send Messages]: ../permissions/struct.Permissions.html#associatedconstant.SEND_MESSAGES #[cfg(feature = "utils")] - pub fn send_files<'a, F, T, It: IntoIterator<Item=T>>(&self, files: It, f: F) -> Result<Message> - where F: FnOnce(CreateMessage) -> CreateMessage, T: Into<AttachmentType<'a>> { - let mut msg = f(CreateMessage::default()); + pub fn send_files<'a, F, T, It>(&self, files: It, f: F) -> Result<Message> + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b>, + T: Into<AttachmentType<'a>>, It: IntoIterator<Item=T> { + let mut create_message = CreateMessage::default(); + let msg = f(&mut create_message); + if let Some(content) = msg.0.get(&"content") { if let Value::String(ref content) = *content { @@ -570,7 +570,7 @@ impl ChannelId { msg.0.insert("payload_json", json!({ "embed": e })); } - let map = utils::vecmap_to_json_map(msg.0); + let map = utils::vecmap_to_json_map(msg.0.clone()); http::send_files(self.0, files, map) } @@ -595,8 +595,9 @@ impl ChannelId { /// [Send Messages]: ../permissions/struct.Permissions.html#associatedconstant.SEND_MESSAGES #[cfg(feature = "utils")] pub fn send_message<F>(&self, f: F) -> Result<Message> - where F: FnOnce(CreateMessage) -> CreateMessage { - let mut msg = f(CreateMessage::default()); + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b> { + let mut create_message = CreateMessage::default(); + let msg = f(&mut create_message); if !msg.2.is_empty() { if let Some(e) = msg.0.remove(&"embed") { @@ -604,7 +605,7 @@ impl ChannelId { } } - let map = utils::vecmap_to_json_map(msg.0); + let map = utils::vecmap_to_json_map(msg.0.clone()); Message::check_content_length(&map)?; Message::check_embed_length(&map)?; @@ -612,10 +613,10 @@ impl ChannelId { let message = if msg.2.is_empty() { http::send_message(self.0, &Value::Object(map))? } else { - http::send_files(self.0, msg.2, map)? + http::send_files(self.0, msg.2.clone(), map)? }; - if let Some(reactions) = msg.1 { + if let Some(reactions) = msg.1.clone() { for reaction in reactions { self.create_reaction(message.id, reaction)?; } diff --git a/src/model/channel/embed.rs b/src/model/channel/embed.rs index 8b2a98c..8ce7696 100644 --- a/src/model/channel/embed.rs +++ b/src/model/channel/embed.rs @@ -84,18 +84,18 @@ impl Embed { /// ```rust,no_run /// use serenity::model::channel::Embed; /// - /// let embed = Embed::fake(|mut e| { - /// e.title("Embed title"); - /// e.description("Making a basic embed"); - /// e.field("A field", "Has some content.", false); - /// - /// e + /// let embed = Embed::fake(|e| { + /// e.title("Embed title") + /// .description("Making a basic embed") + /// .field("A field", "Has some content.", false) /// }); /// ``` #[inline] pub fn fake<F>(f: F) -> Value - where F: FnOnce(CreateEmbed) -> CreateEmbed { - let map = utils::vecmap_to_json_map(f(CreateEmbed::default()).0); + 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); Value::Object(map) } diff --git a/src/model/channel/group.rs b/src/model/channel/group.rs index e6946df..5607f3c 100644 --- a/src/model/channel/group.rs +++ b/src/model/channel/group.rs @@ -200,7 +200,7 @@ impl Group { /// [Read Message History]: ../permissions/struct.Permissions.html#associatedconstant.READ_MESSAGE_HISTORY #[inline] pub fn messages<F>(&self, f: F) -> Result<Vec<Message>> - where F: FnOnce(GetMessages) -> GetMessages { + where F: FnOnce(&mut GetMessages) -> &mut GetMessages { self.channel_id.messages(f) } @@ -307,7 +307,7 @@ impl Group { /// [Send Messages]: ../permissions/struct.Permissions.html#associatedconstant.SEND_MESSAGES #[inline] pub fn send_files<'a, F, T, It: IntoIterator<Item=T>>(&self, files: It, f: F) -> Result<Message> - where F: FnOnce(CreateMessage) -> CreateMessage, T: Into<AttachmentType<'a>> { + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b>, T: Into<AttachmentType<'a>> { self.channel_id.send_files(files, f) } @@ -321,7 +321,8 @@ impl Group { /// [`CreateMessage`]: ../../builder/struct.CreateMessage.html /// [Send Messages]: ../permissions/struct.Permissions.html#associatedconstant.SEND_MESSAGES #[inline] - pub fn send_message<F: FnOnce(CreateMessage) -> CreateMessage>(&self, f: F) -> Result<Message> { + pub fn send_message<F>(&self, f: F) -> Result<Message> + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b> { self.channel_id.send_message(f) } diff --git a/src/model/channel/guild_channel.rs b/src/model/channel/guild_channel.rs index 046ca7c..e667efa 100644 --- a/src/model/channel/guild_channel.rs +++ b/src/model/channel/guild_channel.rs @@ -120,7 +120,7 @@ impl GuildChannel { /// ``` #[cfg(feature = "utils")] pub fn create_invite<F>(&self, f: F) -> Result<RichInvite> - where F: FnOnce(CreateInvite) -> CreateInvite { + where F: FnOnce(&mut CreateInvite) -> &mut CreateInvite { #[cfg(feature = "cache")] { let req = Permissions::CREATE_INVITE; @@ -129,8 +129,10 @@ impl GuildChannel { return Err(Error::Model(ModelError::InvalidPermissions(req))); } } + let mut invite = CreateInvite::default(); + f(&mut invite); - let map = serenity_utils::vecmap_to_json_map(f(CreateInvite::default()).0); + let map = serenity_utils::vecmap_to_json_map(invite.0); http::create_invite(self.id.0, &map) } @@ -419,7 +421,7 @@ impl GuildChannel { /// [Read Message History]: ../permissions/struct.Permissions.html#associatedconstant.READ_MESSAGE_HISTORY #[inline] pub fn messages<F>(&self, f: F) -> Result<Vec<Message>> - where F: FnOnce(GetMessages) -> GetMessages { + where F: FnOnce(&mut GetMessages) -> &mut GetMessages { self.id.messages(f) } @@ -473,7 +475,7 @@ impl GuildChannel { /// struct Handler; /// /// impl EventHandler for Handler { - /// fn message(&self, _: Context, msg: Message) { + /// fn message(&self, _: Context, mut msg: Message) { /// let channel = match CACHE.read().guild_channel(msg.channel_id) { /// Some(channel) => channel, /// None => return, @@ -601,8 +603,9 @@ impl GuildChannel { /// [Attach Files]: ../permissions/struct.Permissions.html#associatedconstant.ATTACH_FILES /// [Send Messages]: ../permissions/struct.Permissions.html#associatedconstant.SEND_MESSAGES #[inline] - pub fn send_files<'a, F, T, It: IntoIterator<Item=T>>(&self, files: It, f: F) -> Result<Message> - where F: FnOnce(CreateMessage) -> CreateMessage, T: Into<AttachmentType<'a>> { + pub fn send_files<'a, F, T, It>(&self, files: It, f: F) -> Result<Message> + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b>, + T: Into<AttachmentType<'a>>, It: IntoIterator<Item=T> { self.id.send_files(files, f) } @@ -625,7 +628,8 @@ impl GuildChannel { /// [`ModelError::MessageTooLong`]: ../error/enum.Error.html#variant.MessageTooLong /// [`Message`]: struct.Message.html /// [Send Messages]: ../permissions/struct.Permissions.html#associatedconstant.SEND_MESSAGES - pub fn send_message<F: FnOnce(CreateMessage) -> CreateMessage>(&self, f: F) -> Result<Message> { + pub fn send_message<F>(&self, f: F) -> Result<Message> + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b> { #[cfg(feature = "cache")] { let req = Permissions::SEND_MESSAGES; diff --git a/src/model/channel/message.rs b/src/model/channel/message.rs index 7a50b1f..0439c15 100644 --- a/src/model/channel/message.rs +++ b/src/model/channel/message.rs @@ -215,7 +215,7 @@ impl Message { /// [`EditMessage`]: ../../builder/struct.EditMessage.html /// [`the limit`]: ../../builder/struct.EditMessage.html#method.content pub fn edit<F>(&mut self, f: F) -> Result<()> - where F: FnOnce(EditMessage) -> EditMessage { + where F: FnOnce(&mut EditMessage) -> &mut EditMessage { #[cfg(feature = "cache")] { if self.author.id != CACHE.read().user.id { @@ -230,10 +230,16 @@ impl Message { } if let Some(embed) = self.embeds.get(0) { - builder.embed(|_| CreateEmbed::from(embed.clone())); + let mut embed = CreateEmbed::from(embed.clone()); + builder.embed( |e| { + *e = embed; + e + }); } - let map = serenity_utils::vecmap_to_json_map(f(builder).0); + f(&mut builder); + + let map = serenity_utils::vecmap_to_json_map(builder.0); match http::edit_message(self.channel_id.0, self.id.0, &Value::Object(map)) { Ok(edited) => { diff --git a/src/model/channel/private_channel.rs b/src/model/channel/private_channel.rs index 4d602c9..30defca 100644 --- a/src/model/channel/private_channel.rs +++ b/src/model/channel/private_channel.rs @@ -175,7 +175,7 @@ impl PrivateChannel { /// [Read Message History]: ../permissions/struct.Permissions.html#associatedconstant.READ_MESSAGE_HISTORY #[inline] pub fn messages<F>(&self, f: F) -> Result<Vec<Message>> - where F: FnOnce(GetMessages) -> GetMessages { + where F: FnOnce(&mut GetMessages) -> &mut GetMessages { self.id.messages(f) } @@ -249,8 +249,9 @@ impl PrivateChannel { /// [Attach Files]: ../permissions/struct.Permissions.html#associatedconstant.ATTACH_FILES /// [Send Messages]: ../permissions/struct.Permissions.html#associatedconstant.SEND_MESSAGES #[inline] - pub fn send_files<'a, F, T, It: IntoIterator<Item=T>>(&self, files: It, f: F) -> Result<Message> - where F: FnOnce(CreateMessage) -> CreateMessage, T: Into<AttachmentType<'a>> { + pub fn send_files<'a, F, T, It>(&self, files: It, f: F) -> Result<Message> + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b>, + T: Into<AttachmentType<'a>>, It: IntoIterator<Item=T> { self.id.send_files(files, f) } @@ -269,7 +270,8 @@ impl PrivateChannel { /// [`CreateMessage`]: ../../builder/struct.CreateMessage.html /// [`Message`]: struct.Message.html #[inline] - pub fn send_message<F: FnOnce(CreateMessage) -> CreateMessage>(&self, f: F) -> Result<Message> { + pub fn send_message<F>(&self, f: F) -> Result<Message> + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b> { self.id.send_message(f) } diff --git a/src/model/guild/guild_id.rs b/src/model/guild/guild_id.rs index abb3262..a7872f5 100644 --- a/src/model/guild/guild_id.rs +++ b/src/model/guild/guild_id.rs @@ -191,8 +191,11 @@ impl GuildId { /// [`Guild::create_role`]: ../guild/struct.Guild.html#method.create_role /// [Manage Roles]: ../permissions/struct.Permissions.html#associatedconstant.MANAGE_ROLES #[inline] - pub fn create_role<F: FnOnce(EditRole) -> EditRole>(&self, f: F) -> Result<Role> { - let map = utils::vecmap_to_json_map(f(EditRole::default()).0); + pub fn create_role<F>(&self, f: F) -> Result<Role> + 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 role = http::create_role(self.0, &map)?; @@ -272,8 +275,11 @@ impl GuildId { /// [`Guild::edit`]: ../guild/struct.Guild.html#method.edit /// [Manage Guild]: ../permissions/struct.Permissions.html#associatedconstant.MANAGE_GUILD #[inline] - pub fn edit<F: FnOnce(EditGuild) -> EditGuild>(&mut self, f: F) -> Result<PartialGuild> { - let map = utils::vecmap_to_json_map(f(EditGuild::default()).0); + pub fn edit<F>(&mut self, f: F) -> Result<PartialGuild> + 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); http::edit_guild(self.0, &map) } diff --git a/src/model/guild/mod.rs b/src/model/guild/mod.rs index ada70da..3f1baad 100644 --- a/src/model/guild/mod.rs +++ b/src/model/guild/mod.rs @@ -418,7 +418,7 @@ impl Guild { /// [`Role`]: struct.Role.html /// [Manage Roles]: ../permissions/struct.Permissions.html#associatedconstant.MANAGE_ROLES pub fn create_role<F>(&self, f: F) -> Result<Role> - where F: FnOnce(EditRole) -> EditRole { + where F: FnOnce(&mut EditRole) -> &mut EditRole { #[cfg(feature = "cache")] { let req = Permissions::MANAGE_ROLES; @@ -520,7 +520,7 @@ impl Guild { /// [`ModelError::InvalidPermissions`]: ../error/enum.Error.html#variant.InvalidPermissions /// [Manage Guild]: ../permissions/struct.Permissions.html#associatedconstant.MANAGE_GUILD pub fn edit<F>(&mut self, f: F) -> Result<()> - where F: FnOnce(EditGuild) -> EditGuild { + where F: FnOnce(&mut EditGuild) -> &mut EditGuild { #[cfg(feature = "cache")] { let req = Permissions::MANAGE_GUILD; diff --git a/src/model/guild/partial_guild.rs b/src/model/guild/partial_guild.rs index 38066e4..38f4d53 100644 --- a/src/model/guild/partial_guild.rs +++ b/src/model/guild/partial_guild.rs @@ -155,7 +155,8 @@ impl PartialGuild { /// [`Guild::create_role`]: struct.Guild.html#method.create_role /// [Manage Roles]: ../permissions/struct.Permissions.html#associatedconstant.MANAGE_ROLES #[inline] - pub fn create_role<F: FnOnce(EditRole) -> EditRole>(&self, f: F) -> Result<Role> { + pub fn create_role<F>(&self, f: F) -> Result<Role> + where F: FnOnce(&mut EditRole) -> &mut EditRole { self.id.create_role(f) } @@ -209,7 +210,7 @@ impl PartialGuild { /// /// [Manage Guild]: ../permissions/struct.Permissions.html#associatedconstant.MANAGE_GUILD pub fn edit<F>(&mut self, f: F) -> Result<()> - where F: FnOnce(EditGuild) -> EditGuild { + where F: FnOnce(&mut EditGuild) -> &mut EditGuild { match self.id.edit(f) { Ok(guild) => { self.afk_channel_id = guild.afk_channel_id; diff --git a/src/model/user.rs b/src/model/user.rs index d0a02df..5676fd1 100644 --- a/src/model/user.rs +++ b/src/model/user.rs @@ -438,10 +438,8 @@ impl User { /// url, /// ); /// - /// let dm = msg.author.direct_message(|mut m| { - /// m.content(&help); - /// - /// m + /// let dm = msg.author.direct_message(|m| { + /// m.content(&help) /// }); /// /// match dm { @@ -486,7 +484,7 @@ impl User { #[allow(let_and_return)] #[cfg(feature = "builder")] pub fn direct_message<F>(&self, f: F) -> Result<Message> - where F: FnOnce(CreateMessage) -> CreateMessage { + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b> { if self.bot { return Err(Error::Model(ModelError::MessagingBot)); } @@ -547,7 +545,8 @@ impl User { /// [direct_message]: #method.direct_message #[cfg(feature = "builder")] #[inline] - pub fn dm<F: FnOnce(CreateMessage) -> CreateMessage>(&self, f: F) -> Result<Message> { + pub fn dm<F>(&self, f: F) -> Result<Message> + where for <'b> F: FnOnce(&'b mut CreateMessage<'b>) -> &'b mut CreateMessage<'b> { self.direct_message(f) } diff --git a/src/model/webhook.rs b/src/model/webhook.rs index 5f0c294..b87bef8 100644 --- a/src/model/webhook.rs +++ b/src/model/webhook.rs @@ -199,11 +199,11 @@ impl Webhook { /// }); /// ``` #[inline] - pub fn execute<F: FnOnce(ExecuteWebhook) -> ExecuteWebhook>(&self, - wait: bool, - f: F) - -> Result<Option<Message>> { - let map = utils::vecmap_to_json_map(f(ExecuteWebhook::default()).0); + pub fn execute<F>(&self, wait: bool, f: F) -> Result<Option<Message>> + 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); http::execute_webhook(self.id.0, &self.token, wait, &map) } |