aboutsummaryrefslogtreecommitdiff
path: root/src/model
diff options
context:
space:
mode:
authorKen Swenson <[email protected]>2018-11-25 14:13:40 -0800
committerAlex M. M <[email protected]>2018-11-25 23:13:40 +0100
commit9a07cc05708e43f1f5777c353b41830bd414e5af (patch)
treed6340432099c1daf960186be58d9449128c454bb /src/model
parentFix links in `Event` (diff)
downloadserenity-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.rs2
-rw-r--r--src/model/channel/channel_id.rs49
-rw-r--r--src/model/channel/embed.rs16
-rw-r--r--src/model/channel/group.rs7
-rw-r--r--src/model/channel/guild_channel.rs18
-rw-r--r--src/model/channel/message.rs12
-rw-r--r--src/model/channel/private_channel.rs10
-rw-r--r--src/model/guild/guild_id.rs14
-rw-r--r--src/model/guild/mod.rs4
-rw-r--r--src/model/guild/partial_guild.rs5
-rw-r--r--src/model/user.rs11
-rw-r--r--src/model/webhook.rs10
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)
}