diff options
| author | acdenisSK <[email protected]> | 2016-12-07 19:10:21 +0100 |
|---|---|---|
| committer | zeyla <[email protected]> | 2016-12-07 10:10:21 -0800 |
| commit | f69512beaa157775accd4392295dba112adcf1df (patch) | |
| tree | 0944aeabdec8609393f78b9ec257dc5d09d4f6c0 /src | |
| parent | Allow mentionable structs to be used as command arguments (diff) | |
| download | serenity-f69512beaa157775accd4392295dba112adcf1df.tar.xz serenity-f69512beaa157775accd4392295dba112adcf1df.zip | |
Change all try's into ?s
This breaks compatibility with < 1.13, but we didn't support that anyway.
Diffstat (limited to 'src')
| -rw-r--r-- | src/client/context.rs | 16 | ||||
| -rw-r--r-- | src/client/gateway/prep.rs | 2 | ||||
| -rw-r--r-- | src/client/gateway/shard.rs | 46 | ||||
| -rw-r--r-- | src/client/mod.rs | 4 | ||||
| -rw-r--r-- | src/client/rest/mod.rs | 226 | ||||
| -rw-r--r-- | src/client/rest/ratelimiting.rs | 10 | ||||
| -rw-r--r-- | src/ext/voice/connection.rs | 94 | ||||
| -rw-r--r-- | src/ext/voice/streamer.rs | 20 | ||||
| -rw-r--r-- | src/internal/ws_impl.rs | 6 | ||||
| -rw-r--r-- | src/model/channel.rs | 100 | ||||
| -rw-r--r-- | src/model/event.rs | 264 | ||||
| -rw-r--r-- | src/model/gateway.rs | 24 | ||||
| -rw-r--r-- | src/model/guild.rs | 94 | ||||
| -rw-r--r-- | src/model/invite.rs | 4 | ||||
| -rw-r--r-- | src/model/mod.rs | 2 | ||||
| -rw-r--r-- | src/model/user.rs | 28 | ||||
| -rw-r--r-- | src/model/utils.rs | 38 | ||||
| -rw-r--r-- | src/model/voice.rs | 1 | ||||
| -rw-r--r-- | src/utils/macros.rs | 16 | ||||
| -rw-r--r-- | src/utils/mod.rs | 2 |
20 files changed, 496 insertions, 501 deletions
diff --git a/src/client/context.rs b/src/client/context.rs index af90447..f0ead27 100644 --- a/src/client/context.rs +++ b/src/client/context.rs @@ -507,7 +507,7 @@ impl Context { // edit. // // [this]: http://github.com/hammerandchisel/discord-api-docs/issues/156 - let role = try!(rest::create_role(id)); + let role = rest::create_role(id)?; let map = f(EditRole::default()).0.build(); rest::edit_role(id, role.id.0, map) @@ -775,7 +775,7 @@ impl Context { F: FnOnce(EditChannel) -> EditChannel { let channel_id = channel_id.into(); - let map = match try!(self.get_channel(channel_id)) { + let map = match self.get_channel(channel_id)? { Channel::Guild(channel) => { let map = ObjectBuilder::new() .insert("name", channel.name) @@ -906,7 +906,7 @@ impl Context { /// ``` pub fn edit_profile<F: FnOnce(EditProfile) -> EditProfile>(&self, f: F) -> Result<CurrentUser> { - let user = try!(rest::get_current_user()); + let user = rest::get_current_user()?; let mut map = ObjectBuilder::new() .insert("avatar", user.avatar) @@ -1070,7 +1070,7 @@ impl Context { let mut channels = HashMap::new(); - for channel in try!(rest::get_channels(guild_id.0)) { + for channel in rest::get_channels(guild_id.0)? { channels.insert(channel.id, channel); } @@ -1250,18 +1250,18 @@ impl Context { let query = { let mut map = f(GetMessages::default()).0; let mut query = String::new(); - try!(write!(query, "?limit={}", map.remove("limit").unwrap_or(50))); + write!(query, "?limit={}", map.remove("limit").unwrap_or(50))?; if let Some(after) = map.remove("after") { - try!(write!(query, "&after={}", after)); + write!(query, "&after={}", after)?; } if let Some(around) = map.remove("around") { - try!(write!(query, "&around={}", around)); + write!(query, "&around={}", around)?; } if let Some(before) = map.remove("before") { - try!(write!(query, "&before={}", before)); + write!(query, "&before={}", before)?; } query diff --git a/src/client/gateway/prep.rs b/src/client/gateway/prep.rs index 6aa40f3..3844a8d 100644 --- a/src/client/gateway/prep.rs +++ b/src/client/gateway/prep.rs @@ -34,7 +34,7 @@ pub fn parse_ready(event: GatewayEvent, let _ = tx.send(GatewayStatus::SendMessage(identification)); - match try!(receiver.recv_json(GatewayEvent::decode)) { + match receiver.recv_json(GatewayEvent::decode)? { GatewayEvent::Dispatch(seq, Event::Ready(event)) => { Ok((event, seq)) }, diff --git a/src/client/gateway/shard.rs b/src/client/gateway/shard.rs index ab9ef73..232d2c3 100644 --- a/src/client/gateway/shard.rs +++ b/src/client/gateway/shard.rs @@ -102,17 +102,17 @@ impl Shard { shard_info: Option<[u8; 2]>, login_type: LoginType) -> Result<(Shard, ReadyEvent, Receiver<WebSocketStream>)> { - let url = try!(prep::build_gateway_url(base_url)); + let url = prep::build_gateway_url(base_url)?; - let response = try!(try!(WsClient::connect(url)).send()); - try!(response.validate()); + let response = WsClient::connect(url)?.send()?; + response.validate()?; let (mut sender, mut receiver) = response.begin().split(); let identification = prep::identify(token, shard_info); - try!(sender.send_json(&identification)); + sender.send_json(&identification)?; - let heartbeat_interval = match try!(receiver.recv_json(GatewayEvent::decode)) { + let heartbeat_interval = match receiver.recv_json(GatewayEvent::decode)? { GatewayEvent::Hello(interval) => interval, other => { debug!("Unexpected event during connection start: {:?}", other); @@ -128,16 +128,16 @@ impl Shard { info[1] - 1), None => "serenity keepalive [unsharded]".to_owned(), }; - try!(ThreadBuilder::new() + ThreadBuilder::new() .name(thread_name) - .spawn(move || prep::keepalive(heartbeat_interval, sender, rx))); + .spawn(move || prep::keepalive(heartbeat_interval, sender, rx))?; // Parse READY - let event = try!(receiver.recv_json(GatewayEvent::decode)); - let (ready, sequence) = try!(prep::parse_ready(event, + let event = receiver.recv_json(GatewayEvent::decode)?; + let (ready, sequence) = prep::parse_ready(event, &tx, &mut receiver, - identification)); + identification)?; Ok((feature_voice! {{ Shard { @@ -356,11 +356,11 @@ impl Shard { let mut sender = Sender::new(stream.by_ref(), true); let message = WsMessage::close_because(1000, ""); - try!(sender.send_message(&message)); + sender.send_message(&message)?; } - try!(stream.flush()); - try!(stream.shutdown(Shutdown::Both)); + stream.flush()?; + stream.shutdown(Shutdown::Both)?; Ok(()) } @@ -434,7 +434,7 @@ impl Shard { // Take a few attempts at reconnecting. for i in 1u64..11u64 { - let gateway_url = try!(rest::get_gateway()).url; + let gateway_url = rest::get_gateway()?.url; let shard = Shard::new(&gateway_url, &self.token, @@ -442,7 +442,7 @@ impl Shard { self.login_type); if let Ok((shard, ready, receiver_new)) = shard { - try!(mem::replace(self, shard).shutdown(&mut receiver)); + mem::replace(self, shard).shutdown(&mut receiver)?; self.session_id = Some(ready.ready.session_id.clone()); @@ -459,27 +459,27 @@ impl Shard { fn resume(&mut self, session_id: String, receiver: &mut Receiver<WebSocketStream>) -> Result<(Event, Receiver<WebSocketStream>)> { - try!(receiver.get_mut().get_mut().shutdown(Shutdown::Both)); - let url = try!(prep::build_gateway_url(&self.ws_url)); + receiver.get_mut().get_mut().shutdown(Shutdown::Both)?; + let url = prep::build_gateway_url(&self.ws_url)?; - let response = try!(try!(WsClient::connect(url)).send()); - try!(response.validate()); + let response = WsClient::connect(url)?.send()?; + response.validate()?; let (mut sender, mut receiver) = response.begin().split(); - try!(sender.send_json(&ObjectBuilder::new() + sender.send_json(&ObjectBuilder::new() .insert_object("d", |o| o .insert("session_id", session_id) .insert("seq", self.last_sequence) .insert("token", &self.token) ) .insert("op", OpCode::Resume.num()) - .build())); + .build())?; let first_event; loop { - match try!(receiver.recv_json(GatewayEvent::decode)) { + match receiver.recv_json(GatewayEvent::decode)? { GatewayEvent::Dispatch(seq, event) => { if let Event::Ready(ref event) = event { self.session_id = Some(event.ready.session_id.clone()); @@ -491,7 +491,7 @@ impl Shard { break; }, GatewayEvent::InvalidateSession => { - try!(sender.send_json(&prep::identify(&self.token, self.shard_info))); + sender.send_json(&prep::identify(&self.token, self.shard_info))?; }, other => { debug!("Unexpected event: {:?}", other); diff --git a/src/client/mod.rs b/src/client/mod.rs index cf67b5b..843bbfe 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -279,7 +279,7 @@ impl Client { /// /// [gateway docs]: gateway/index.html#sharding pub fn start_autosharded(&mut self) -> Result<()> { - let res = try!(rest::get_bot_gateway()); + let res = rest::get_bot_gateway()?; self.start_connection(Some([0, res.shards as u8 - 1, res.shards as u8])) } @@ -768,7 +768,7 @@ impl Client { // // Not all shards need to be initialized in this process. fn start_connection(&mut self, shard_data: Option<[u8; 3]>) -> Result<()> { - let gateway_url = try!(rest::get_gateway()).url; + let gateway_url = rest::get_gateway()?.url; for i in 0..shard_data.map_or(1, |x| x[1] + 1) { let shard = Shard::new(&gateway_url, diff --git a/src/client/rest/mod.rs b/src/client/rest/mod.rs index 97796fd..1ef59b8 100644 --- a/src/client/rest/mod.rs +++ b/src/client/rest/mod.rs @@ -102,7 +102,7 @@ pub fn set_token(token: &str) { pub fn accept_invite(code: &str) -> Result<Invite> { let response = request!(Route::InvitesCode, post, "/invites/{}", code); - Invite::decode(try!(serde_json::from_reader(response))) + Invite::decode(serde_json::from_reader(response)?) } /// Marks a [`Channel`] as being "read" up to a certain [`Message`]. Any @@ -205,13 +205,13 @@ pub fn broadcast_typing(channel_id: u64) -> Result<()> { /// [docs]: https://discordapp.com/developers/docs/resources/guild#create-guild-channel /// [Manage Channels]: ../../model/permissions/constant.MANAGE_CHANNELS.html pub fn create_channel(guild_id: u64, map: Value) -> Result<Channel> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::GuildsIdChannels(guild_id), post(body), "/guilds/{}/channels", guild_id); - Channel::decode(try!(serde_json::from_reader(response))) + Channel::decode(serde_json::from_reader(response)?) } /// Creates an emoji in the given [`Guild`] with the given data. @@ -226,13 +226,13 @@ pub fn create_channel(guild_id: u64, map: Value) -> Result<Channel> { /// [Manage Emojis]: ../../model/permissions/constant.MANAGE_EMOJIS.html pub fn create_emoji(guild_id: u64, map: Value) -> Result<Emoji> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::GuildsIdEmojis(guild_id), post(body), "/guilds/{}/emojis", guild_id); - Emoji::decode(try!(serde_json::from_reader(response))) + Emoji::decode(serde_json::from_reader(response)?) } /// Creates a guild with the data provided. @@ -270,10 +270,10 @@ pub fn create_emoji(guild_id: u64, map: Value) /// [US West Region]: ../../model/enum.Region.html#variant.UsWest /// [whitelist]: https://discordapp.com/developers/docs/resources/guild#create-guild pub fn create_guild(map: Value) -> Result<PartialGuild> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::Guilds, post(body), "/guilds"); - PartialGuild::decode(try!(serde_json::from_reader(response))) + PartialGuild::decode(serde_json::from_reader(response)?) } /// Creates an [`Integration`] for a [`Guild`]. @@ -288,7 +288,7 @@ pub fn create_guild(map: Value) -> Result<PartialGuild> { /// [docs]: https://discordapp.com/developers/docs/resources/guild#create-guild-integration pub fn create_guild_integration(guild_id: u64, integration_id: u64, map: Value) -> Result<()> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; verify(204, request!(Route::GuildsIdIntegrations(guild_id), post(body), @@ -311,19 +311,19 @@ pub fn create_guild_integration(guild_id: u64, integration_id: u64, map: Value) /// [docs]: https://discordapp.com/developers/docs/resources/channel#create-channel-invite pub fn create_invite(channel_id: u64, map: Value) -> Result<RichInvite> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::ChannelsIdInvites(channel_id), post(body), "/channels/{}/invites", channel_id); - RichInvite::decode(try!(serde_json::from_reader(response))) + RichInvite::decode(serde_json::from_reader(response)?) } /// Creates a permission override for a member or a role in a channel. pub fn create_permission(channel_id: u64, target_id: u64, map: Value) -> Result<()> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; verify(204, request!(Route::ChannelsIdPermissionsOverwriteId(channel_id), put(body), @@ -335,12 +335,12 @@ pub fn create_permission(channel_id: u64, target_id: u64, map: Value) /// Creates a private channel with a user. pub fn create_private_channel(map: Value) -> Result<PrivateChannel> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::UsersMeChannels, post(body), "/users/@me/channels"); - PrivateChannel::decode(try!(serde_json::from_reader(response))) + PrivateChannel::decode(serde_json::from_reader(response)?) } /// Reacts to a message. @@ -364,7 +364,7 @@ pub fn create_role(guild_id: u64) -> Result<Role> { "/guilds/{}/roles", guild_id); - Role::decode(try!(serde_json::from_reader(response))) + Role::decode(serde_json::from_reader(response)?) } /// Creates a webhook for the given [channel][`GuildChannel`]'s Id, passing in @@ -398,13 +398,13 @@ pub fn create_role(guild_id: u64) -> Result<Role> { /// /// [`GuildChannel`]: ../../model/struct.GuildChannel.html pub fn create_webhook(channel_id: u64, map: Value) -> Result<Webhook> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::ChannelsIdWebhooks(channel_id), post(body), "/channels/{}/webhooks", channel_id); - Webhook::decode(try!(serde_json::from_reader(response))) + Webhook::decode(serde_json::from_reader(response)?) } /// Deketes a private channel or a channel in a guild. @@ -414,7 +414,7 @@ pub fn delete_channel(channel_id: u64) -> Result<Channel> { "/channels/{}", channel_id); - Channel::decode(try!(serde_json::from_reader(response))) + Channel::decode(serde_json::from_reader(response)?) } /// Deletes an emoji from a server. @@ -433,7 +433,7 @@ pub fn delete_guild(guild_id: u64) -> Result<PartialGuild> { "/guilds/{}", guild_id); - PartialGuild::decode(try!(serde_json::from_reader(response))) + PartialGuild::decode(serde_json::from_reader(response)?) } /// Remvoes an integration from a guild. @@ -450,7 +450,7 @@ pub fn delete_guild_integration(guild_id: u64, integration_id: u64) pub fn delete_invite(code: &str) -> Result<Invite> { let response = request!(Route::InvitesCode, delete, "/invites/{}", code); - Invite::decode(try!(serde_json::from_reader(response))) + Invite::decode(serde_json::from_reader(response)?) } /// Deletes a message if created by us or we have @@ -466,7 +466,7 @@ pub fn delete_message(channel_id: u64, message_id: u64) /// Deletes a bunch of messages, only works for bots. pub fn delete_messages(channel_id: u64, map: Value) -> Result<()> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; verify(204, request!(Route::ChannelsIdMessagesBulkDelete(channel_id), post(body), @@ -582,64 +582,64 @@ pub fn delete_webhook(webhook_id: u64) -> Result<()> { /// [`Webhook`]: ../../model/struct.Webhook.html pub fn delete_webhook_with_token(webhook_id: u64, token: &str) -> Result<()> { let client = HyperClient::new(); - verify(204, try!(retry(|| client + verify(204, retry(|| client .delete(&format!(api!("/webhooks/{}/{}"), webhook_id, token))) - .map_err(Error::Hyper))) + .map_err(Error::Hyper)?) } /// Changes channel information. pub fn edit_channel(channel_id: u64, map: Value) -> Result<GuildChannel> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::ChannelsId(channel_id), patch(body), "/channels/{}", channel_id); - GuildChannel::decode(try!(serde_json::from_reader(response))) + GuildChannel::decode(serde_json::from_reader(response)?) } /// Changes emoji information. pub fn edit_emoji(guild_id: u64, emoji_id: u64, map: Value) -> Result<Emoji> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::GuildsIdEmojisId(guild_id), patch(body), "/guilds/{}/emojis/{}", guild_id, emoji_id); - Emoji::decode(try!(serde_json::from_reader(response))) + Emoji::decode(serde_json::from_reader(response)?) } /// Changes guild information. pub fn edit_guild(guild_id: u64, map: Value) -> Result<PartialGuild> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::GuildsId(guild_id), patch(body), "/guilds/{}", guild_id); - PartialGuild::decode(try!(serde_json::from_reader(response))) + PartialGuild::decode(serde_json::from_reader(response)?) } /// Edits a [`Guild`]'s embed setting. /// /// [`Guild`]: ../../model/struct.Guild.html pub fn edit_guild_embed(guild_id: u64, map: Value) -> Result<GuildEmbed> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::GuildsIdEmbed(guild_id), patch(body), "/guilds/{}/embed", guild_id); - GuildEmbed::decode(try!(serde_json::from_reader(response))) + GuildEmbed::decode(serde_json::from_reader(response)?) } /// Does specific actions to a member. pub fn edit_member(guild_id: u64, user_id: u64, map: Value) -> Result<()> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; verify(204, request!(Route::GuildsIdMembersId(guild_id), patch(body), @@ -653,14 +653,14 @@ pub fn edit_message(channel_id: u64, message_id: u64, map: Value) -> Result<Message> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::ChannelsIdMessagesId(channel_id), patch(body), "/channels/{}/messages/{}", channel_id, message_id); - Message::decode(try!(serde_json::from_reader(response))) + Message::decode(serde_json::from_reader(response)?) } /// Edits the current user's nickname for the provided [`Guild`] via its Id. @@ -671,7 +671,7 @@ pub fn edit_message(channel_id: u64, pub fn edit_nickname(guild_id: u64, new_nickname: Option<&str>) -> Result<()> { let map = ObjectBuilder::new().insert("nick", new_nickname).build(); - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::GuildsIdMembersMeNick(guild_id), patch(body), "/guilds/{}/members/@me/nick", @@ -682,7 +682,7 @@ pub fn edit_nickname(guild_id: u64, new_nickname: Option<&str>) /// Changes a profile note. pub fn edit_note(user_id: u64, map: Value) -> Result<()> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; verify(204, request!(Route::None, put(body), @@ -704,10 +704,10 @@ pub fn edit_note(user_id: u64, map: Value) -> Result<()> { /// the token may be outdated. /// pub fn edit_profile(map: Value) -> Result<CurrentUser> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::UsersMe, patch(body), "/users/@me"); - let mut map: BTreeMap<String, Value> = try!(serde_json::from_reader(response)); + let mut map: BTreeMap<String, Value> = serde_json::from_reader(response)?; if let Some(Value::String(token)) = map.remove("token") { set_token(&token) @@ -719,14 +719,14 @@ pub fn edit_profile(map: Value) -> Result<CurrentUser> { /// Changes a role in a guild. pub fn edit_role(guild_id: u64, role_id: u64, map: Value) -> Result<Role> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::GuildsIdRolesId(guild_id), patch(body), "/guilds/{}/roles/{}", guild_id, role_id); - Role::decode(try!(serde_json::from_reader(response))) + Role::decode(serde_json::from_reader(response)?) } /// Edits a the webhook with the given data. @@ -769,13 +769,13 @@ pub fn edit_role(guild_id: u64, role_id: u64, map: Value) // The tests are ignored, rather than no_run'd, due to rustdoc tests with // external crates being incredibly messy and misleading in the end user's view. pub fn edit_webhook(webhook_id: u64, map: Value) -> Result<Webhook> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::WebhooksId, patch(body), "/webhooks/{}", webhook_id); - Webhook::decode(try!(serde_json::from_reader(response))) + Webhook::decode(serde_json::from_reader(response)?) } /// Edits the webhook with the given data. @@ -806,14 +806,14 @@ pub fn edit_webhook(webhook_id: u64, map: Value) -> Result<Webhook> { /// [`edit_webhook`]: fn.edit_webhook.html pub fn edit_webhook_with_token(webhook_id: u64, token: &str, map: Value) -> Result<Webhook> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let client = HyperClient::new(); - let response = try!(retry(|| client + let response = retry(|| client .patch(&format!(api!("/webhooks/{}/{}"), webhook_id, token)) .body(&body)) - .map_err(Error::Hyper)); + .map_err(Error::Hyper)?; - Webhook::decode(try!(serde_json::from_reader(response))) + Webhook::decode(serde_json::from_reader(response)?) } /// Executes a webhook, posting a [`Message`] in the webhook's associated @@ -868,14 +868,14 @@ pub fn edit_webhook_with_token(webhook_id: u64, token: &str, map: Value) /// }; pub fn execute_webhook(webhook_id: u64, token: &str, map: Value) -> Result<Message> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let client = HyperClient::new(); - let response = try!(retry(|| client + let response = retry(|| client .patch(&format!(api!("/webhooks/{}/{}"), webhook_id, token)) .body(&body)) - .map_err(Error::Hyper)); + .map_err(Error::Hyper)?; - Message::decode(try!(serde_json::from_reader(response))) + Message::decode(serde_json::from_reader(response)?) } /// Gets the active maintenances from Discord's Status API. @@ -883,10 +883,10 @@ pub fn execute_webhook(webhook_id: u64, token: &str, map: Value) /// Does not require authentication. pub fn get_active_maintenances() -> Result<Vec<Maintenance>> { let client = HyperClient::new(); - let response = try!(retry(|| client.get( - status!("/scheduled-maintenances/active.json")))); + let response = retry(|| client.get( + status!("/scheduled-maintenances/active.json")))?; - let mut map: BTreeMap<String, Value> = try!(serde_json::from_reader(response)); + let mut map: BTreeMap<String, Value> = serde_json::from_reader(response)?; match map.remove("scheduled_maintenances") { Some(v) => decode_array(v, Maintenance::decode), @@ -900,7 +900,7 @@ pub fn get_active_maintenances() -> Result<Vec<Maintenance>> { pub fn get_application_info() -> Result<CurrentApplicationInfo> { let response = request!(Route::None, get, "/oauth2/applications/@me"); - CurrentApplicationInfo::decode(try!(serde_json::from_reader(response))) + CurrentApplicationInfo::decode(serde_json::from_reader(response)?) } /// Gets all oauth2 applications we've made. @@ -908,7 +908,7 @@ pub fn get_application_info() -> Result<CurrentApplicationInfo> { /// **Note**: Only user accounts may use this endpoint. pub fn get_applications() -> Result<Vec<ApplicationInfo>> { let response = request!(Route::None, get, "/oauth2/applications"); - let decoded = try!(serde_json::from_reader(response)); + let decoded = serde_json::from_reader(response)?; decode_array(decoded, ApplicationInfo::decode) } @@ -920,14 +920,14 @@ pub fn get_bans(guild_id: u64) -> Result<Vec<Ban>> { "/guilds/{}/bans", guild_id); - decode_array(try!(serde_json::from_reader(response)), Ban::decode) + decode_array(serde_json::from_reader(response)?, Ban::decode) } /// Gets current bot gateway. pub fn get_bot_gateway() -> Result<BotGateway> { let response = request!(Route::GatewayBot, get, "/gateway/bot"); - BotGateway::decode(try!(serde_json::from_reader(response))) + BotGateway::decode(serde_json::from_reader(response)?) } /// Gets all invites for a channel. @@ -938,7 +938,7 @@ pub fn get_channel_invites(channel_id: u64) "/channels/{}/invites", channel_id); - decode_array(try!(serde_json::from_reader(response)), + decode_array(serde_json::from_reader(response)?, RichInvite::decode) } @@ -966,7 +966,7 @@ pub fn get_channel_webhooks(channel_id: u64) -> Result<Vec<Webhook>> { "/channels/{}/webhooks", channel_id); - decode_array(try!(serde_json::from_reader(response)), Webhook::decode) + decode_array(serde_json::from_reader(response)?, Webhook::decode) } /// Gets channel information. @@ -976,7 +976,7 @@ pub fn get_channel(channel_id: u64) -> Result<Channel> { "/channels/{}", channel_id); - Channel::decode(try!(serde_json::from_reader(response))) + Channel::decode(serde_json::from_reader(response)?) } /// Gets all channels in a guild. @@ -986,7 +986,7 @@ pub fn get_channels(guild_id: u64) -> Result<Vec<GuildChannel>> { "/guilds/{}/channels", guild_id); - decode_array(try!(serde_json::from_reader(response)), + decode_array(serde_json::from_reader(response)?, GuildChannel::decode) } @@ -994,14 +994,14 @@ pub fn get_channels(guild_id: u64) -> Result<Vec<GuildChannel>> { pub fn get_current_user() -> Result<CurrentUser> { let response = request!(Route::UsersMe, get, "/users/@me"); - CurrentUser::decode(try!(serde_json::from_reader(response))) + CurrentUser::decode(serde_json::from_reader(response)?) } /// Gets current gateway. pub fn get_gateway() -> Result<Gateway> { let response = request!(Route::Gateway, get, "/gateway"); - Gateway::decode(try!(serde_json::from_reader(response))) + Gateway::decode(serde_json::from_reader(response)?) } /// Gets information about an emoji. @@ -1012,7 +1012,7 @@ pub fn get_emoji(guild_id: u64, emoji_id: u64) -> Result<Emoji> { guild_id, emoji_id); - Emoji::decode(try!(serde_json::from_reader(response))) + Emoji::decode(serde_json::from_reader(response)?) } /// Gets all emojis in a guild. @@ -1022,7 +1022,7 @@ pub fn get_emojis(guild_id: u64) -> Result<Vec<Emoji>> { "/guilds/{}/emojis", guild_id); - decode_array(try!(serde_json::from_reader(response)), Emoji::decode) + decode_array(serde_json::from_reader(response)?, Emoji::decode) } /// Gets guild information. @@ -1032,7 +1032,7 @@ pub fn get_guild(guild_id: u64) -> Result<PartialGuild> { "/guilds/{}", guild_id); - PartialGuild::decode(try!(serde_json::from_reader(response))) + PartialGuild::decode(serde_json::from_reader(response)?) } /// Gets a guild embed information. @@ -1042,7 +1042,7 @@ pub fn get_guild_embed(guild_id: u64) -> Result<GuildEmbed> { "/guilds/{}/embeds", guild_id); - GuildEmbed::decode(try!(serde_json::from_reader(response))) + GuildEmbed::decode(serde_json::from_reader(response)?) } /// Gets integrations that a guild has. @@ -1052,7 +1052,7 @@ pub fn get_guild_integrations(guild_id: u64) -> Result<Vec<Integration>> { "/guilds/{}/integrations", guild_id); - decode_array(try!(serde_json::from_reader(response)), Integration::decode) + decode_array(serde_json::from_reader(response)?, Integration::decode) } /// Gets all invites to a guild. @@ -1062,7 +1062,7 @@ pub fn get_guild_invites(guild_id: u64) -> Result<Vec<RichInvite>> { "/guilds/{}/invites", guild_id); - decode_array(try!(serde_json::from_reader(response)), RichInvite::decode) + decode_array(serde_json::from_reader(response)?, RichInvite::decode) } /// Gets the members of a guild. Optionally pass a `limit` and the Id of the @@ -1076,19 +1076,19 @@ pub fn get_guild_members(guild_id: u64, limit: Option<u64>, after: Option<u64>) limit.unwrap_or(500), after.unwrap_or(0)); - decode_array(try!(serde_json::from_reader(response)), Member::decode) + decode_array(serde_json::from_reader(response)?, Member::decode) } /// Gets the amount of users that can be pruned. pub fn get_guild_prune_count(guild_id: u64, map: Value) -> Result<GuildPrune> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::GuildsIdPrune(guild_id), get(body), "/guilds/{}/prune", guild_id); - GuildPrune::decode(try!(serde_json::from_reader(response))) + GuildPrune::decode(serde_json::from_reader(response)?) } /// Gets regions that a guild can use. If a guild has [`Feature::VipRegions`] @@ -1101,7 +1101,7 @@ pub fn get_guild_regions(guild_id: u64) -> Result<Vec<VoiceRegion>> { "/guilds/{}/regions", guild_id); - decode_array(try!(serde_json::from_reader(response)), VoiceRegion::decode) + decode_array(serde_json::from_reader(response)?, VoiceRegion::decode) } /// Retrieves a list of roles in a [`Guild`]. @@ -1113,7 +1113,7 @@ pub fn get_guild_roles(guild_id: u64) -> Result<Vec<Role>> { "/guilds/{}/roles", guild_id); - decode_array(try!(serde_json::from_reader(response)), Role::decode) + decode_array(serde_json::from_reader(response)?, Role::decode) } /// Retrieves the webhooks for the given [guild][`Guild`]'s Id. @@ -1140,7 +1140,7 @@ pub fn get_guild_webhooks(guild_id: u64) -> Result<Vec<Webhook>> { "/guilds/{}/webhooks", guild_id); - decode_array(try!(serde_json::from_reader(response)), Webhook::decode) + decode_array(serde_json::from_reader(response)?, Webhook::decode) } /// Gets a paginated list of the current user's guilds. @@ -1168,16 +1168,16 @@ pub fn get_guilds(target: GuildPagination, limit: u64) -> Result<Vec<GuildInfo>> match target { GuildPagination::After(id) => { - try!(write!(uri, "&after={}", id)); + write!(uri, "&after={}", id)?; }, GuildPagination::Before(id) => { - try!(write!(uri, "&before={}", id)); + write!(uri, "&before={}", id)?; }, } let response = request!(Route::UsersMeGuilds, get, "{}", uri); - decode_array(try!(serde_json::from_reader(response)), GuildInfo::decode) + decode_array(serde_json::from_reader(response)?, GuildInfo::decode) } /// Gets information about a specific invite. @@ -1185,7 +1185,7 @@ pub fn get_invite(code: &str) -> Result<Invite> { let invite = ::utils::parse_invite(code); let response = request!(Route::InvitesCode, get, "/invites/{}", invite); - Invite::decode(try!(serde_json::from_reader(response))) + Invite::decode(serde_json::from_reader(response)?) } /// Gets member of a guild. @@ -1196,7 +1196,7 @@ pub fn get_member(guild_id: u64, user_id: u64) -> Result<Member> { guild_id, user_id); - Member::decode(try!(serde_json::from_reader(response))) + Member::decode(serde_json::from_reader(response)?) } /// Gets a message by an Id, bots only. @@ -1208,7 +1208,7 @@ pub fn get_message(channel_id: u64, message_id: u64) channel_id, message_id); - Message::decode(try!(serde_json::from_reader(response))) + Message::decode(serde_json::from_reader(response)?) } /// Gets X messages from a channel. @@ -1218,10 +1218,10 @@ pub fn get_messages(channel_id: u64, query: &str) channel_id, query); let client = HyperClient::new(); - let response = try!(request(Route::ChannelsIdMessages(channel_id), - || client.get(&url))); + let response = request(Route::ChannelsIdMessages(channel_id), + || client.get(&url))?; - decode_array(try!(serde_json::from_reader(response)), Message::decode) + decode_array(serde_json::from_reader(response)?, Message::decode) } /// Gets all pins of a channel. @@ -1231,7 +1231,7 @@ pub fn get_pins(channel_id: u64) -> Result<Vec<Message>> { "/channels/{}/pins", channel_id); - decode_array(try!(serde_json::from_reader(response)), Message::decode) + decode_array(serde_json::from_reader(response)?, Message::decode) } /// Gets user Ids based on their reaction to a message. This endpoint is dumb. @@ -1248,7 +1248,7 @@ pub fn get_reaction_users(channel_id: u64, limit); if let Some(user_id) = after { - try!(write!(uri, "&after={}", user_id)); + write!(uri, "&after={}", user_id)?; } let response = request!(Route::ChannelsIdMessagesIdReactionsUserIdType(channel_id), @@ -1256,7 +1256,7 @@ pub fn get_reaction_users(channel_id: u64, "{}", uri); - decode_array(try!(serde_json::from_reader(response)), User::decode) + decode_array(serde_json::from_reader(response)?, User::decode) } /// Gets the current unresolved incidents from Discord's Status API. @@ -1264,10 +1264,10 @@ pub fn get_reaction_users(channel_id: u64, /// Does not require authentication. pub fn get_unresolved_incidents() -> Result<Vec<Incident>> { let client = HyperClient::new(); - let response = try!(retry(|| client.get( - status!("/incidents/unresolved.json")))); + let response = retry(|| client.get( + status!("/incidents/unresolved.json")))?; - let mut map: BTreeMap<String, Value> = try!(serde_json::from_reader(response)); + let mut map: BTreeMap<String, Value> = serde_json::from_reader(response)?; match map.remove("incidents") { Some(incidents) => decode_array(incidents, Incident::decode), @@ -1280,10 +1280,10 @@ pub fn get_unresolved_incidents() -> Result<Vec<Incident>> { /// Does not require authentication. pub fn get_upcoming_maintenances() -> Result<Vec<Maintenance>> { let client = HyperClient::new(); - let response = try!(retry(|| client.get( - status!("/scheduled-maintenances/upcoming.json")))); + let response = retry(|| client.get( + status!("/scheduled-maintenances/upcoming.json")))?; - let mut map: BTreeMap<String, Value> = try!(serde_json::from_reader(response)); + let mut map: BTreeMap<String, Value> = serde_json::from_reader(response)?; match map.remove("scheduled_maintenances") { Some(v) => decode_array(v, Maintenance::decode), @@ -1295,7 +1295,7 @@ pub fn get_upcoming_maintenances() -> Result<Vec<Maintenance>> { pub fn get_user(user_id: u64) -> Result<CurrentUser> { let response = request!(Route::UsersId, get, "/users/{}", user_id); - CurrentUser::decode(try!(serde_json::from_reader(response))) + CurrentUser::decode(serde_json::from_reader(response)?) } /// Gets our connections. @@ -1304,7 +1304,7 @@ pub fn get_user_connections() -> Result<Vec<UserConnection>> { get, "/users/@me/connections"); - decode_array(try!(serde_json::from_reader(response)), + decode_array(serde_json::from_reader(response)?, UserConnection::decode) } @@ -1312,7 +1312,7 @@ pub fn get_user_connections() -> Result<Vec<UserConnection>> { pub fn get_user_dm_channels() -> Result<Vec<PrivateChannel>> { let response = request!(Route::UsersMeChannels, get, "/users/@me/channels"); - decode_array(try!(serde_json::from_reader(response)), + decode_array(serde_json::from_reader(response)?, PrivateChannel::decode) } @@ -1320,7 +1320,7 @@ pub fn get_user_dm_channels() -> Result<Vec<PrivateChannel>> { pub fn get_voice_regions() -> Result<Vec<VoiceRegion>> { let response = request!(Route::VoiceRegions, get, "/voice/regions"); - decode_array(try!(serde_json::from_reader(response)), VoiceRegion::decode) + decode_array(serde_json::from_reader(response)?, VoiceRegion::decode) } /// Retrieves a webhook given its Id. @@ -1343,7 +1343,7 @@ pub fn get_voice_regions() -> Result<Vec<VoiceRegion>> { pub fn get_webhook(webhook_id: u64) -> Result<Webhook> { let response = request!(Route::WebhooksId, get, "/webhooks/{}", webhook_id); - Webhook::decode(try!(serde_json::from_reader(response))) + Webhook::decode(serde_json::from_reader(response)?) } /// Retrieves a webhook given its Id and unique token. @@ -1365,11 +1365,11 @@ pub fn get_webhook(webhook_id: u64) -> Result<Webhook> { /// ``` pub fn get_webhook_with_token(webhook_id: u64, token: &str) -> Result<Webhook> { let client = HyperClient::new(); - let response = try!(retry(|| client + let response = retry(|| client .get(&format!(api!("/webhooks/{}/{}"), webhook_id, token))) - .map_err(Error::Hyper)); + .map_err(Error::Hyper)?; - Webhook::decode(try!(serde_json::from_reader(response))) + Webhook::decode(serde_json::from_reader(response)?) } /// Kicks a member from a guild. @@ -1388,7 +1388,7 @@ pub fn leave_group(guild_id: u64) -> Result<Group> { "/channels/{}", guild_id); - Group::decode(try!(serde_json::from_reader(response))) + Group::decode(serde_json::from_reader(response)?) } /// Leaves a guild. @@ -1398,12 +1398,12 @@ pub fn leave_guild(guild_id: u64) -> Result<PartialGuild> { "/users/@me/guilds/{}", guild_id); - PartialGuild::decode(try!(serde_json::from_reader(response))) + PartialGuild::decode(serde_json::from_reader(response)?) } /// Logs out. That's supposed to disable the token but doesn't. pub fn logout(map: Value) -> Result<()> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; verify(204, request!(Route::None, post(body), "/auth/logout")) } @@ -1430,15 +1430,15 @@ pub fn send_file<R: Read>(channel_id: u64, Err(_why) => return Err(Error::Url(uri)), }; - let mut request = try!(Request::new(Method::Post, url)); + let mut request = Request::new(Method::Post, url)?; request.headers_mut() .set(header::Authorization(TOKEN.lock().unwrap().clone())); request.headers_mut() .set(header::UserAgent(constants::USER_AGENT.to_owned())); - let mut request = try!(Multipart::from_request(request)); + let mut request = Multipart::from_request(request)?; - try!(request.write_stream("file", &mut file, Some(&filename), None)); + request.write_stream("file", &mut file, Some(&filename), None)?; for (k, v) in map { let val = match v { @@ -1448,21 +1448,21 @@ pub fn send_file<R: Read>(channel_id: u64, _ => continue, }; - try!(request.write_text(&k, val)); + request.write_text(&k, val)?; } - Message::decode(try!(serde_json::from_reader(try!(request.send())))) + Message::decode(serde_json::from_reader(request.send()?)?) } /// Sends a message to a channel. pub fn send_message(channel_id: u64, map: Value) -> Result<Message> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::ChannelsIdMessages(channel_id), post(body), "/channels/{}/messages", channel_id); - Message::decode(try!(serde_json::from_reader(response))) + Message::decode(serde_json::from_reader(response)?) } /// Pins a message in a channel. @@ -1504,13 +1504,13 @@ pub fn remove_member_role(guild_id: u64, user_id: u64, role_id: u64) -> Result<( /// Starts removing some members from a guild based on the last time they've been online. pub fn start_guild_prune(guild_id: u64, map: Value) -> Result<GuildPrune> { - let body = try!(serde_json::to_string(&map)); + let body = serde_json::to_string(&map)?; let response = request!(Route::GuildsIdPrune(guild_id), post(body), "/guilds/{}/prune", guild_id); - GuildPrune::decode(try!(serde_json::from_reader(response))) + GuildPrune::decode(serde_json::from_reader(response)?) } /// Starts syncing an integration with a guild. @@ -1574,7 +1574,7 @@ fn verify(expected_status_code: u16, debug!("Expected {}, got {}", expected_status_code, response.status); let mut s = String::default(); - try!(response.read_to_string(&mut s)); + response.read_to_string(&mut s)?; debug!("Content: {}", s); diff --git a/src/client/rest/ratelimiting.rs b/src/client/rest/ratelimiting.rs index 0b3ea7e..ac085eb 100644 --- a/src/client/rest/ratelimiting.rs +++ b/src/client/rest/ratelimiting.rs @@ -128,7 +128,7 @@ pub fn perform<'a, F>(route: Route, f: F) -> Result<Response> } } - let response = try!(super::retry(&f)); + let response = super::retry(&f)?; // Check if the request got ratelimited by checking for status 429, // and if so, sleep for the value of the header 'retry-after' - @@ -201,21 +201,21 @@ impl RateLimit { } pub fn post_hook(&mut self, response: &Response) -> Result<bool> { - if let Some(limit) = try!(get_header(&response.headers, "x-ratelimit-limit")) { + if let Some(limit) = get_header(&response.headers, "x-ratelimit-limit")? { self.limit = limit; } - if let Some(remaining) = try!(get_header(&response.headers, "x-ratelimit-remaining")) { + if let Some(remaining) = get_header(&response.headers, "x-ratelimit-remaining")? { self.remaining = remaining; } - if let Some(reset) = try!(get_header(&response.headers, "x-ratelimit-reset")) { + if let Some(reset) = get_header(&response.headers, "x-ratelimit-reset")? { self.reset = reset; } Ok(if response.status != StatusCode::TooManyRequests { false - } else if let Some(retry_after) = try!(get_header(&response.headers, "retry-after")) { + } else if let Some(retry_after) = get_header(&response.headers, "retry-after")? { debug!("Ratelimited: {:?}ms", retry_after); thread::sleep(Duration::from_millis(retry_after as u64)); diff --git a/src/ext/voice/connection.rs b/src/ext/voice/connection.rs index 58b8e1f..373f4ef 100644 --- a/src/ext/voice/connection.rs +++ b/src/ext/voice/connection.rs @@ -63,21 +63,19 @@ pub struct Connection { impl Connection { pub fn new(mut info: ConnectionInfo) -> Result<Connection> { - let url = try!(generate_url(&mut info.endpoint)); + let url = generate_url(&mut info.endpoint)?; - let response = try!(try!(WsClient::connect(url)).send()); - try!(response.validate()); + let response = WsClient::connect(url)?.send()?; + response.validate()?; let (mut sender, mut receiver) = response.begin().split(); - try!(sender.send_json(&payload::build_identify(&info))); + sender.send_json(&payload::build_identify(&info))?; let hello = { let hello; loop { - let k = receiver.recv_json(VoiceEvent::decode); - - match try!(k) { + match receiver.recv_json(VoiceEvent::decode)? { VoiceEvent::Hello(received_hello) => { hello = received_hello; @@ -100,10 +98,10 @@ impl Connection { return Err(Error::Voice(VoiceError::VoiceModeUnavailable)); } - let destination = try!(try!((&info.endpoint[..], hello.port) - .to_socket_addrs()) + let destination = (&info.endpoint[..], hello.port) + .to_socket_addrs()? .next() - .ok_or(Error::Voice(VoiceError::HostnameResolve))); + .ok_or(Error::Voice(VoiceError::HostnameResolve))?; // Important to note here: the length of the packet can be of either 4 // or 70 bytes. If it is 4 bytes, then we need to send a 70-byte packet @@ -113,37 +111,37 @@ impl Connection { // // The returned packet will be a null-terminated string of the IP, and // the port encoded in LE in the last two bytes of the packet. - let udp = try!(UdpSocket::bind("0.0.0.0:0")); + let udp = UdpSocket::bind("0.0.0.0:0")?; { let mut bytes = [0; 70]; - try!((&mut bytes[..]).write_u32::<BigEndian>(hello.ssrc)); - try!(udp.send_to(&bytes, destination)); + (&mut bytes[..]).write_u32::<BigEndian>(hello.ssrc)?; + udp.send_to(&bytes, destination)?; let mut bytes = [0; 256]; - let (len, _addr) = try!(udp.recv_from(&mut bytes)); + let (len, _addr) = udp.recv_from(&mut bytes)?; // Find the position in the bytes that contains the first byte of 0, // indicating the "end of the address". - let index = try!(bytes.iter().skip(4).position(|&x| x == 0) - .ok_or(Error::Voice(VoiceError::FindingByte))); + let index = bytes.iter().skip(4).position(|&x| x == 0) + .ok_or(Error::Voice(VoiceError::FindingByte))?; let pos = 4 + index; let addr = String::from_utf8_lossy(&bytes[4..pos]); let port_pos = len - 2; - let port = try!((&bytes[port_pos..]).read_u16::<LittleEndian>()); + let port = (&bytes[port_pos..]).read_u16::<LittleEndian>()?; - try!(sender.send_json(&payload::build_select_protocol(addr, port))); + sender.send_json(&payload::build_select_protocol(addr, port))?; } - let key = try!(get_encryption_key(&mut receiver)); + let key = get_encryption_key(&mut receiver)?; - let thread_items = try!(start_threads(receiver, &udp)); + let thread_items = start_threads(receiver, &udp)?; info!("[Voice] Connected to: {}", info.endpoint); - let encoder = try!(OpusEncoder::new(SAMPLE_RATE, Channels::Mono, CodingMode::Audio)); + let encoder = OpusEncoder::new(SAMPLE_RATE, Channels::Mono, CodingMode::Audio)?; Ok(Connection { audio_timer: Timer::new(1000 * 60 * 4), @@ -179,21 +177,21 @@ impl Connection { match status { ReceiverStatus::Udp(packet) => { let mut handle = &packet[2..]; - let seq = try!(handle.read_u16::<BigEndian>()); - let timestamp = try!(handle.read_u32::<BigEndian>()); - let ssrc = try!(handle.read_u32::<BigEndian>()); + let seq = handle.read_u16::<BigEndian>()?; + let timestamp = handle.read_u32::<BigEndian>()?; + let ssrc = handle.read_u32::<BigEndian>()?; nonce.0[..HEADER_LEN].clone_from_slice(&packet[..HEADER_LEN]); if let Ok(decrypted) = secretbox::open(&packet[HEADER_LEN..], &nonce, &self.key) { - let channels = try!(opus_packet::get_nb_channels(&decrypted)); + let channels = opus_packet::get_nb_channels(&decrypted)?; let entry = self.decoder_map.entry((ssrc, channels)) .or_insert_with(|| OpusDecoder::new(SAMPLE_RATE, channels) .unwrap()); - let len = try!(entry.decode(&decrypted, &mut buffer, false)); + let len = entry.decode(&decrypted, &mut buffer, false)?; let is_stereo = channels == Channels::Stereo; @@ -227,20 +225,20 @@ impl Connection { // Send the voice websocket keepalive if it's time if self.keepalive_timer.check() { - try!(self.sender.send_json(&payload::build_keepalive())); + self.sender.send_json(&payload::build_keepalive())?; } // Send UDP keepalive if it's time if self.audio_timer.check() { let mut bytes = [0; 4]; - try!((&mut bytes[..]).write_u32::<BigEndian>(self.ssrc)); - try!(self.udp.send_to(&bytes, self.destination)); + (&mut bytes[..]).write_u32::<BigEndian>(self.ssrc)?; + self.udp.send_to(&bytes, self.destination)?; } - let len = try!(self.read(source, &mut buffer)); + let len = self.read(source, &mut buffer)?; if len == 0 { - try!(self.set_speaking(false)); + self.set_speaking(false)?; if self.silence_frames > 0 { self.silence_frames -= 1; @@ -261,11 +259,11 @@ impl Connection { } } - try!(self.set_speaking(true)); - let index = try!(self.prep_packet(&mut packet, buffer, nonce)); + self.set_speaking(true)?; + let index = self.prep_packet(&mut packet, buffer, nonce)?; audio_timer.await(); - try!(self.udp.send_to(&packet[..index], self.destination)); + self.udp.send_to(&packet[..index], self.destination)?; self.audio_timer.reset(); Ok(()) @@ -278,10 +276,10 @@ impl Connection { -> Result<usize> { { let mut cursor = &mut packet[..HEADER_LEN]; - try!(cursor.write_all(&[0x80, 0x78])); - try!(cursor.write_u16::<BigEndian>(self.sequence)); - try!(cursor.write_u32::<BigEndian>(self.timestamp)); - try!(cursor.write_u32::<BigEndian>(self.ssrc)); + cursor.write_all(&[0x80, 0x78])?; + cursor.write_u16::<BigEndian>(self.sequence)?; + cursor.write_u32::<BigEndian>(self.timestamp)?; + cursor.write_u32::<BigEndian>(self.ssrc)?; } nonce.0[..HEADER_LEN].clone_from_slice(&packet[..HEADER_LEN]); @@ -293,8 +291,8 @@ impl Connection { 960 }; - let len = try!(self.encoder.encode(&buffer[..buffer_len], - &mut packet[HEADER_LEN..sl_index])); + let len = self.encoder.encode(&buffer[..buffer_len], + &mut packet[HEADER_LEN..sl_index])?; let crypted = { let slice = &packet[HEADER_LEN..HEADER_LEN + len]; secretbox::seal(slice, &nonce, &self.key) @@ -324,9 +322,9 @@ impl Connection { } else { Channels::Mono }; - self.encoder = try!(OpusEncoder::new(SAMPLE_RATE, + self.encoder = OpusEncoder::new(SAMPLE_RATE, channels, - CodingMode::Audio)); + CodingMode::Audio)?; self.encoder_stereo = is_stereo; } @@ -390,7 +388,7 @@ fn generate_url(endpoint: &mut String) -> Result<WebsocketUrl> { fn get_encryption_key(receiver: &mut WsReceiver<WebSocketStream>) -> Result<Key> { loop { - match try!(receiver.recv_json(VoiceEvent::decode)) { + match receiver.recv_json(VoiceEvent::decode)? { VoiceEvent::Ready(ready) => { if ready.mode != CRYPTO_MODE { return Err(Error::Voice(VoiceError::VoiceModeInvalid)); @@ -425,9 +423,9 @@ fn start_threads(mut receiver: WsReceiver<WebSocketStream>, udp: &UdpSocket) let (tx, rx) = mpsc::channel(); let tx_clone = tx.clone(); - let udp_clone = try!(udp.try_clone()); + let udp_clone = udp.try_clone()?; - let udp_thread = try!(ThreadBuilder::new() + let udp_thread = ThreadBuilder::new() .name(format!("{} UDP", thread_name)) .spawn(move || { let _ = udp_clone.set_read_timeout(Some(Duration::from_millis(250))); @@ -446,9 +444,9 @@ fn start_threads(mut receiver: WsReceiver<WebSocketStream>, udp: &UdpSocket) return; } } - })); + })?; - let ws_thread = try!(ThreadBuilder::new() + let ws_thread = ThreadBuilder::new() .name(format!("{} WS", thread_name)) .spawn(move || { loop { @@ -464,7 +462,7 @@ fn start_threads(mut receiver: WsReceiver<WebSocketStream>, udp: &UdpSocket) thread::sleep(Duration::from_millis(25)); } - })); + })?; Ok(ThreadItems { rx: rx, diff --git a/src/ext/voice/streamer.rs b/src/ext/voice/streamer.rs index ed1c620..1c08a1b 100644 --- a/src/ext/voice/streamer.rs +++ b/src/ext/voice/streamer.rs @@ -60,14 +60,14 @@ pub fn ffmpeg<P: AsRef<OsStr>>(path: P) -> Result<Box<AudioSource>> { "-", ]; - let command = try!(Command::new("ffmpeg") + let command = Command::new("ffmpeg") .arg("-i") .arg(path) .args(&args) .stderr(Stdio::null()) .stdin(Stdio::null()) .stdout(Stdio::piped()) - .spawn()); + .spawn()?; Ok(pcm(is_stereo, ChildContainer(command))) } @@ -87,16 +87,16 @@ pub fn ytdl(uri: &str) -> Result<Box<AudioSource>> { uri, ]; - let out = try!(Command::new("youtube-dl") + let out = Command::new("youtube-dl") .args(&args) .stdin(Stdio::null()) - .output()); + .output()?; if !out.status.success() { return Err(Error::Voice(VoiceError::YouTubeDLRun(out))); } - let value = try!(serde_json::from_reader(&out.stdout[..])); + let value = serde_json::from_reader(&out.stdout[..])?; let mut obj = match value { Value::Object(obj) => obj, other => return Err(Error::Voice(VoiceError::YouTubeDLProcessing(other))), @@ -123,18 +123,18 @@ fn is_stereo(path: &OsStr) -> Result<bool> { "-i", ]; - let out = try!(Command::new("ffprobe") + let out = Command::new("ffprobe") .args(&args) .arg(path) .stdin(Stdio::null()) - .output()); + .output()?; - let value: Value = try!(serde_json::from_reader(&out.stdout[..])); + let value: Value = serde_json::from_reader(&out.stdout[..])?; - let streams = try!(value.as_object() + let streams = value.as_object() .and_then(|m| m.get("streams")) .and_then(|v| v.as_array()) - .ok_or(Error::Voice(VoiceError::Streams))); + .ok_or(Error::Voice(VoiceError::Streams))?; let check = streams.iter() .any(|stream| { diff --git a/src/internal/ws_impl.rs b/src/internal/ws_impl.rs index 72af52c..9fd2e2d 100644 --- a/src/internal/ws_impl.rs +++ b/src/internal/ws_impl.rs @@ -19,7 +19,7 @@ pub trait SenderExt { impl ReceiverExt for Receiver<WebSocketStream> { fn recv_json<F, T>(&mut self, decode: F) -> Result<T> where F: FnOnce(Value) -> Result<T> { - let message: WsMessage = try!(self.recv_message()); + let message: WsMessage = self.recv_message()?; if message.opcode == WsType::Close { let r = String::from_utf8_lossy(&message.payload).into_owned(); @@ -27,9 +27,9 @@ impl ReceiverExt for Receiver<WebSocketStream> { Err(Error::Gateway(GatewayError::Closed(message.cd_status_code, r))) } else if message.opcode == WsType::Binary || message.opcode == WsType::Text { let json: Value = if message.opcode == WsType::Binary { - try!(serde_json::from_reader(ZlibDecoder::new(&message.payload[..]))) + serde_json::from_reader(ZlibDecoder::new(&message.payload[..]))? } else { - try!(serde_json::from_reader(&message.payload[..])) + serde_json::from_reader(&message.payload[..])? }; match decode(json) { diff --git a/src/model/channel.rs b/src/model/channel.rs index 7036a1d..19f59ef 100644 --- a/src/model/channel.rs +++ b/src/model/channel.rs @@ -117,10 +117,10 @@ impl Attachment { #[cfg(feature = "methods")] pub fn download(&self) -> Result<Vec<u8>> { let hyper = HyperClient::new(); - let mut response = try!(hyper.get(&self.url).send()); + let mut response = hyper.get(&self.url).send()?; let mut bytes = vec![]; - try!(response.read_to_end(&mut bytes)); + response.read_to_end(&mut bytes)?; Ok(bytes) } @@ -181,11 +181,11 @@ impl Attachment { /// [`Message`]: struct.Message.html #[cfg(feature = "methods")] pub fn download_to_directory<P: AsRef<Path>>(&self, path: P) -> Result<PathBuf> { - let bytes = try!(self.download()); + let bytes = self.download()?; let filepath: PathBuf = path.as_ref().join(&self.filename); - let mut file = try!(File::create(&filepath)); - try!(file.write(&bytes)); + let mut file = File::create(&filepath)?; + file.write(&bytes)?; Ok(filepath) } @@ -194,7 +194,7 @@ impl Attachment { impl Channel { #[doc(hidden)] pub fn decode(value: Value) -> Result<Channel> { - let map = try!(into_map(value)); + let map = into_map(value)?; match req!(map.get("type").and_then(|x| x.as_u64())) { 0 | 2 => GuildChannel::decode(Value::Object(map)) .map(Channel::Guild), @@ -217,13 +217,13 @@ impl Channel { pub fn delete(&self) -> Result<()> { match *self { Channel::Group(ref group) => { - let _ = try!(group.leave()); + let _ = group.leave()?; }, Channel::Guild(ref public_channel) => { - let _ = try!(public_channel.delete()); + let _ = public_channel.delete()?; }, Channel::Private(ref private_channel) => { - let _ = try!(private_channel.delete()); + let _ = private_channel.delete()?; }, } @@ -441,7 +441,7 @@ impl Message { feature_cache_enabled! {{ let req = permissions::MANAGE_MESSAGES; let is_author = self.author.id != CACHE.read().unwrap().user.id; - let has_perms = try!(utils::user_has_perms(self.channel_id, req)); + let has_perms = utils::user_has_perms(self.channel_id, req)?; if !is_author && !has_perms { return Err(Error::Client(ClientError::InvalidPermissions(req))); @@ -469,7 +469,7 @@ impl Message { feature_cache_enabled! {{ let req = permissions::MANAGE_MESSAGES; - if !try!(utils::user_has_perms(self.channel_id, req)) { + if !utils::user_has_perms(self.channel_id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -583,7 +583,7 @@ impl Message { feature_cache_enabled! {{ let req = permissions::MANAGE_MESSAGES; - if !try!(utils::user_has_perms(self.channel_id, req)) { + if !utils::user_has_perms(self.channel_id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -610,7 +610,7 @@ impl Message { feature_cache_enabled! {{ let req = permissions::ADD_REACTIONS; - if !try!(utils::user_has_perms(self.channel_id, req)) { + if !utils::user_has_perms(self.channel_id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -651,7 +651,7 @@ impl Message { feature_cache_enabled! {{ let req = permissions::SEND_MESSAGES; - if !try!(utils::user_has_perms(self.channel_id, req)) { + if !utils::user_has_perms(self.channel_id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -686,7 +686,7 @@ impl Message { feature_cache_enabled! {{ let req = permissions::MANAGE_MESSAGES; - if !try!(utils::user_has_perms(self.channel_id, req)) { + if !utils::user_has_perms(self.channel_id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -698,9 +698,9 @@ impl Message { impl PermissionOverwrite { #[doc(hidden)] pub fn decode(value: Value) -> Result<PermissionOverwrite> { - let mut map = try!(into_map(value)); - let id = try!(remove(&mut map, "id").and_then(decode_id)); - let kind = try!(remove(&mut map, "type").and_then(into_string)); + let mut map = into_map(value)?; + let id = remove(&mut map, "id").and_then(decode_id)?; + let kind = remove(&mut map, "type").and_then(into_string)?; let kind = match &*kind { "member" => PermissionOverwriteType::Member(UserId(id)), "role" => PermissionOverwriteType::Role(RoleId(id)), @@ -709,8 +709,8 @@ impl PermissionOverwrite { Ok(PermissionOverwrite { kind: kind, - allow: try!(remove(&mut map, "allow").and_then(Permissions::decode)), - deny: try!(remove(&mut map, "deny").and_then(Permissions::decode)), + allow: remove(&mut map, "allow").and_then(Permissions::decode)?, + deny: remove(&mut map, "deny").and_then(Permissions::decode)?, }) } } @@ -724,15 +724,15 @@ impl PrivateChannel { #[doc(hidden)] pub fn decode(value: Value) -> Result<PrivateChannel> { - let mut map = try!(into_map(value)); - let mut recipients = try!(decode_array(try!(remove(&mut map, "recipients")), - User::decode)); + let mut map = into_map(value)?; + let mut recipients = decode_array(remove(&mut map, "recipients")?, + User::decode)?; Ok(PrivateChannel { - id: try!(remove(&mut map, "id").and_then(ChannelId::decode)), - kind: try!(remove(&mut map, "type").and_then(ChannelType::decode)), - last_message_id: try!(opt(&mut map, "last_message_id", MessageId::decode)), - last_pin_timestamp: try!(opt(&mut map, "last_pin_timestamp", into_string)), + id: remove(&mut map, "id").and_then(ChannelId::decode)?, + kind: remove(&mut map, "type").and_then(ChannelType::decode)?, + last_message_id: opt(&mut map, "last_message_id", MessageId::decode)?, + last_pin_timestamp: opt(&mut map, "last_pin_timestamp", into_string)?, recipient: recipients.remove(0), }) } @@ -853,7 +853,7 @@ impl GuildChannel { feature_cache_enabled! {{ let req = permissions::CREATE_INVITE; - if !try!(utils::user_has_perms(self.id, req)) { + if !utils::user_has_perms(self.id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -865,29 +865,29 @@ impl GuildChannel { #[doc(hidden)] pub fn decode(value: Value) -> Result<GuildChannel> { - let mut map = try!(into_map(value)); + let mut map = into_map(value)?; - let id = try!(remove(&mut map, "guild_id").and_then(GuildId::decode)); + let id = remove(&mut map, "guild_id").and_then(GuildId::decode)?; GuildChannel::decode_guild(Value::Object(map), id) } #[doc(hidden)] pub fn decode_guild(value: Value, guild_id: GuildId) -> Result<GuildChannel> { - let mut map = try!(into_map(value)); + let mut map = into_map(value)?; Ok(GuildChannel { - id: try!(remove(&mut map, "id").and_then(ChannelId::decode)), - name: try!(remove(&mut map, "name").and_then(into_string)), + id: remove(&mut map, "id").and_then(ChannelId::decode)?, + name: remove(&mut map, "name").and_then(into_string)?, guild_id: guild_id, - topic: try!(opt(&mut map, "topic", into_string)), - position: req!(try!(remove(&mut map, "position")).as_i64()), - kind: try!(remove(&mut map, "type").and_then(ChannelType::decode)), - last_message_id: try!(opt(&mut map, "last_message_id", MessageId::decode)), - permission_overwrites: try!(decode_array(try!(remove(&mut map, "permission_overwrites")), PermissionOverwrite::decode)), + topic: opt(&mut map, "topic", into_string)?, + position: req!(remove(&mut map, "position")?.as_i64()), + kind: remove(&mut map, "type").and_then(ChannelType::decode)?, + last_message_id: opt(&mut map, "last_message_id", MessageId::decode)?, + permission_overwrites: decode_array(remove(&mut map, "permission_overwrites")?, PermissionOverwrite::decode)?, bitrate: remove(&mut map, "bitrate").ok().and_then(|v| v.as_u64()), user_limit: remove(&mut map, "user_limit").ok().and_then(|v| v.as_u64()), - last_pin_timestamp: try!(opt(&mut map, "last_pin_timestamp", into_string)), + last_pin_timestamp: opt(&mut map, "last_pin_timestamp", into_string)?, }) } @@ -897,7 +897,7 @@ impl GuildChannel { let req = permissions::MANAGE_CHANNELS; feature_cache_enabled! {{ - if !try!(utils::user_has_perms(self.id, req)) { + if !utils::user_has_perms(self.id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -924,7 +924,7 @@ impl GuildChannel { let req = permissions::MANAGE_CHANNELS; feature_cache_enabled! {{ - if !try!(utils::user_has_perms(self.id, req)) { + if !utils::user_has_perms(self.id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -988,7 +988,7 @@ impl GuildChannel { feature_cache_enabled! {{ let req = permissions::SEND_MESSAGES; - if !try!(utils::user_has_perms(self.id, req)) { + if !utils::user_has_perms(self.id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -1151,11 +1151,11 @@ impl ReactionType { #[doc(hidden)] pub fn decode(value: Value) -> Result<Self> { - let mut map = try!(into_map(value)); - let name = try!(remove(&mut map, "name").and_then(into_string)); + let mut map = into_map(value)?; + let name = remove(&mut map, "name").and_then(into_string)?; // Only custom emoji reactions (`ReactionType::Custom`) have an Id. - Ok(match try!(opt(&mut map, "id", EmojiId::decode)) { + Ok(match opt(&mut map, "id", EmojiId::decode)? { Some(id) => ReactionType::Custom { id: id, name: name, @@ -1195,11 +1195,11 @@ impl fmt::Display for ReactionType { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { ReactionType::Custom { id, ref name } => { - try!(f.write_char('<')); - try!(f.write_char(':')); - try!(f.write_str(&name)); - try!(f.write_char(':')); - try!(fmt::Display::fmt(&id, f)); + f.write_char('<')?; + f.write_char(':')?; + f.write_str(&name)?; + f.write_char(':')?; + fmt::Display::fmt(&id, f)?; f.write_char('>') }, ReactionType::Unicode(ref unicode) => f.write_str(unicode), diff --git a/src/model/event.rs b/src/model/event.rs index d459503..4746ed5 100644 --- a/src/model/event.rs +++ b/src/model/event.rs @@ -339,27 +339,27 @@ pub enum GatewayEvent { impl GatewayEvent { pub fn decode(value: Value) -> Result<Self> { - let mut value = try!(into_map(value)); + let mut value = into_map(value)?; let op = req!(value.get("op").and_then(|x| x.as_u64())); - match try!(OpCode::from_num(op).ok_or(Error::Client(ClientError::InvalidOpCode))) { + match OpCode::from_num(op).ok_or(Error::Client(ClientError::InvalidOpCode))? { OpCode::Event => Ok(GatewayEvent::Dispatch( - req!(try!(remove(&mut value, "s")).as_u64()), - try!(Event::decode( - try!(remove(&mut value, "t").and_then(into_string)), - try!(remove(&mut value, "d")) - )) + req!(remove(&mut value, "s")?.as_u64()), + Event::decode( + remove(&mut value, "t").and_then(into_string)?, + remove(&mut value, "d")? + )? )), OpCode::Heartbeat => { - Ok(GatewayEvent::Heartbeat(req!(try!(remove(&mut value, "s")) + Ok(GatewayEvent::Heartbeat(req!(remove(&mut value, "s")? .as_u64()))) }, OpCode::Reconnect => Ok(GatewayEvent::Reconnect), OpCode::InvalidSession => Ok(GatewayEvent::InvalidateSession), OpCode::Hello => { - let mut data = try!(remove(&mut value, "d").and_then(into_map)); - let interval = req!(try!(remove(&mut data, "heartbeat_interval")).as_u64()); + let mut data = remove(&mut value, "d").and_then(into_map)?; + let interval = req!(remove(&mut data, "heartbeat_interval")?.as_u64()); Ok(GatewayEvent::Hello(interval)) }, OpCode::HeartbeatAck => Ok(GatewayEvent::HeartbeatAck), @@ -478,209 +478,209 @@ impl Event { fn decode(kind: String, value: Value) -> Result<Event> { if kind == "PRESENCES_REPLACE" { return Ok(Event::PresencesReplace(PresencesReplaceEvent { - presences: try!(decode_array(value, Presence::decode)), + presences: decode_array(value, Presence::decode)?, })); } - let mut value = try!(into_map(value)); + let mut value = into_map(value)?; if kind == "CALL_CREATE" { Ok(Event::CallCreate(CallCreateEvent { - call: try!(Call::decode(Value::Object(value))), + call: Call::decode(Value::Object(value))?, })) } else if kind == "CALL_DELETE" { Ok(Event::CallDelete(CallDeleteEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, })) } else if kind == "CALL_UPDATE" { Ok(Event::CallUpdate(CallUpdateEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - message_id: try!(remove(&mut value, "message_id").and_then(MessageId::decode)), - region: try!(remove(&mut value, "region").and_then(into_string)), - ringing: try!(decode_array(try!(remove(&mut value, "ringing")), UserId::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + message_id: remove(&mut value, "message_id").and_then(MessageId::decode)?, + region: remove(&mut value, "region").and_then(into_string)?, + ringing: decode_array(remove(&mut value, "ringing")?, UserId::decode)?, })) } else if kind == "CHANNEL_CREATE" { Ok(Event::ChannelCreate(ChannelCreateEvent { - channel: try!(Channel::decode(Value::Object(value))), + channel: Channel::decode(Value::Object(value))?, })) } else if kind == "CHANNEL_DELETE" { Ok(Event::ChannelDelete(ChannelDeleteEvent { - channel: try!(Channel::decode(Value::Object(value))), + channel: Channel::decode(Value::Object(value))?, })) } else if kind == "CHANNEL_PINS_ACK" { Ok(Event::ChannelPinsAck(ChannelPinsAckEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - timestamp: try!(remove(&mut value, "timestamp").and_then(into_string)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + timestamp: remove(&mut value, "timestamp").and_then(into_string)?, })) } else if kind == "CHANNEL_PINS_UPDATE" { Ok(Event::ChannelPinsUpdate(ChannelPinsUpdateEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - last_pin_timestamp: try!(opt(&mut value, "last_pin_timestamp", into_string)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + last_pin_timestamp: opt(&mut value, "last_pin_timestamp", into_string)?, })) } else if kind == "CHANNEL_RECIPIENT_ADD" { Ok(Event::ChannelRecipientAdd(ChannelRecipientAddEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - user: try!(remove(&mut value, "user").and_then(User::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + user: remove(&mut value, "user").and_then(User::decode)?, })) } else if kind == "CHANNEL_RECIPIENT_REMOVE" { Ok(Event::ChannelRecipientRemove(ChannelRecipientRemoveEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - user: try!(remove(&mut value, "user").and_then(User::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + user: remove(&mut value, "user").and_then(User::decode)?, })) } else if kind == "CHANNEL_UPDATE" { Ok(Event::ChannelUpdate(ChannelUpdateEvent { - channel: try!(Channel::decode(Value::Object(value))), + channel: Channel::decode(Value::Object(value))?, })) } else if kind == "FRIEND_SUGGESTION_CREATE" { Ok(Event::FriendSuggestionCreate(FriendSuggestionCreateEvent { - reasons: try!(decode_array(try!(remove(&mut value, "reasons")), SuggestionReason::decode)), - suggested_user: try!(remove(&mut value, "suggested_user").and_then(User::decode)), + reasons: decode_array(remove(&mut value, "reasons")?, SuggestionReason::decode)?, + suggested_user: remove(&mut value, "suggested_user").and_then(User::decode)?, })) } else if kind == "FRIEND_SUGGESTION_DELETE" { Ok(Event::FriendSuggestionDelete(FriendSuggestionDeleteEvent { - suggested_user_id: try!(remove(&mut value, "suggested_user_id").and_then(UserId::decode)), + suggested_user_id: remove(&mut value, "suggested_user_id").and_then(UserId::decode)?, })) } else if kind == "GUILD_BAN_ADD" { Ok(Event::GuildBanAdd(GuildBanAddEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), - user: try!(remove(&mut value, "user").and_then(User::decode)), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, + user: remove(&mut value, "user").and_then(User::decode)?, })) } else if kind == "GUILD_BAN_REMOVE" { Ok(Event::GuildBanRemove(GuildBanRemoveEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), - user: try!(remove(&mut value, "user").and_then(User::decode)), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, + user: remove(&mut value, "user").and_then(User::decode)?, })) } else if kind == "GUILD_CREATE" { if remove(&mut value, "unavailable").ok().and_then(|v| v.as_bool()).unwrap_or(false) { Ok(Event::GuildUnavailable(GuildUnavailableEvent { - guild_id: try!(remove(&mut value, "id").and_then(GuildId::decode)), + guild_id: remove(&mut value, "id").and_then(GuildId::decode)?, })) } else { Ok(Event::GuildCreate(GuildCreateEvent { - guild: try!(Guild::decode(Value::Object(value))), + guild: Guild::decode(Value::Object(value))?, })) } } else if kind == "GUILD_DELETE" { if remove(&mut value, "unavailable").ok().and_then(|v| v.as_bool()).unwrap_or(false) { Ok(Event::GuildUnavailable(GuildUnavailableEvent { - guild_id: try!(remove(&mut value, "id").and_then(GuildId::decode)), + guild_id: remove(&mut value, "id").and_then(GuildId::decode)?, })) } else { Ok(Event::GuildDelete(GuildDeleteEvent { - guild: try!(PartialGuild::decode(Value::Object(value))), + guild: PartialGuild::decode(Value::Object(value))?, })) } } else if kind == "GUILD_EMOJIS_UPDATE" { Ok(Event::GuildEmojisUpdate(GuildEmojisUpdateEvent { - emojis: try!(remove(&mut value, "emojis").and_then(decode_emojis)), - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), + emojis: remove(&mut value, "emojis").and_then(decode_emojis)?, + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, })) } else if kind == "GUILD_INTEGRATIONS_UPDATE" { Ok(Event::GuildIntegrationsUpdate(GuildIntegrationsUpdateEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, })) } else if kind == "GUILD_MEMBER_ADD" { Ok(Event::GuildMemberAdd(GuildMemberAddEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), - member: try!(Member::decode(Value::Object(value))), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, + member: Member::decode(Value::Object(value))?, })) } else if kind == "GUILD_MEMBER_REMOVE" { Ok(Event::GuildMemberRemove(GuildMemberRemoveEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), - user: try!(remove(&mut value, "user").and_then(User::decode)), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, + user: remove(&mut value, "user").and_then(User::decode)?, })) } else if kind == "GUILD_MEMBER_UPDATE" { Ok(Event::GuildMemberUpdate(GuildMemberUpdateEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), - nick: try!(opt(&mut value, "nick", into_string)), - roles: try!(decode_array(try!(remove(&mut value, "roles")), RoleId::decode)), - user: try!(remove(&mut value, "user").and_then(User::decode)), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, + nick: opt(&mut value, "nick", into_string)?, + roles: decode_array(remove(&mut value, "roles")?, RoleId::decode)?, + user: remove(&mut value, "user").and_then(User::decode)?, })) } else if kind == "GUILD_MEMBERS_CHUNK" { Ok(Event::GuildMembersChunk(GuildMembersChunkEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), - members: try!(remove(&mut value, "members").and_then(decode_members)), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, + members: remove(&mut value, "members").and_then(decode_members)?, })) } else if kind == "GUILD_ROLE_CREATE" { Ok(Event::GuildRoleCreate(GuildRoleCreateEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), - role: try!(remove(&mut value, "role").and_then(Role::decode)), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, + role: remove(&mut value, "role").and_then(Role::decode)?, })) } else if kind == "GUILD_ROLE_DELETE" { Ok(Event::GuildRoleDelete(GuildRoleDeleteEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), - role_id: try!(remove(&mut value, "role_id").and_then(RoleId::decode)), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, + role_id: remove(&mut value, "role_id").and_then(RoleId::decode)?, })) } else if kind == "GUILD_ROLE_UPDATE" { Ok(Event::GuildRoleUpdate(GuildRoleUpdateEvent { - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), - role: try!(remove(&mut value, "role").and_then(Role::decode)), + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, + role: remove(&mut value, "role").and_then(Role::decode)?, })) } else if kind == "GUILD_SYNC" { Ok(Event::GuildSync(GuildSyncEvent { - guild_id: try!(remove(&mut value, "id").and_then(GuildId::decode)), - large: req!(try!(remove(&mut value, "large")).as_bool()), - members: try!(remove(&mut value, "members").and_then(decode_members)), - presences: try!(remove(&mut value, "presences").and_then(decode_presences)), + guild_id: remove(&mut value, "id").and_then(GuildId::decode)?, + large: req!(remove(&mut value, "large")?.as_bool()), + members: remove(&mut value, "members").and_then(decode_members)?, + presences: remove(&mut value, "presences").and_then(decode_presences)?, })) } else if kind == "GUILD_UPDATE" { Ok(Event::GuildUpdate(GuildUpdateEvent { - guild: try!(PartialGuild::decode(Value::Object(value))), + guild: PartialGuild::decode(Value::Object(value))?, })) } else if kind == "MESSAGE_ACK" { Ok(Event::MessageAck(MessageAckEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - message_id: try!(opt(&mut value, "message_id", MessageId::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + message_id: opt(&mut value, "message_id", MessageId::decode)?, })) } else if kind == "MESSAGE_CREATE" { Ok(Event::MessageCreate(MessageCreateEvent { - message: try!(Message::decode(Value::Object(value))), + message: Message::decode(Value::Object(value))?, })) } else if kind == "MESSAGE_DELETE" { Ok(Event::MessageDelete(MessageDeleteEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - message_id: try!(remove(&mut value, "id").and_then(MessageId::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + message_id: remove(&mut value, "id").and_then(MessageId::decode)?, })) } else if kind == "MESSAGE_DELETE_BULK" { Ok(Event::MessageDeleteBulk(MessageDeleteBulkEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - ids: try!(decode_array(try!(remove(&mut value, "ids")), MessageId::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + ids: decode_array(remove(&mut value, "ids")?, MessageId::decode)?, })) } else if kind == "MESSAGE_REACTION_ADD" { Ok(Event::ReactionAdd(ReactionAddEvent { - reaction: try!(Reaction::decode(Value::Object(value))) + reaction: Reaction::decode(Value::Object(value))? })) } else if kind == "MESSAGE_REACTION_REMOVE" { Ok(Event::ReactionRemove(ReactionRemoveEvent { - reaction: try!(Reaction::decode(Value::Object(value))) + reaction: Reaction::decode(Value::Object(value))? })) } else if kind == "MESSAGE_REACTION_REMOVE_ALL" { Ok(Event::ReactionRemoveAll(ReactionRemoveAllEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - message_id: try!(remove(&mut value, "message_id").and_then(MessageId::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + message_id: remove(&mut value, "message_id").and_then(MessageId::decode)?, })) } else if kind == "MESSAGE_UPDATE" { Ok(Event::MessageUpdate(MessageUpdateEvent { - id: try!(remove(&mut value, "id").and_then(MessageId::decode)), - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - kind: try!(opt(&mut value, "type", MessageType::decode)), - content: try!(opt(&mut value, "content", into_string)), + id: remove(&mut value, "id").and_then(MessageId::decode)?, + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + kind: opt(&mut value, "type", MessageType::decode)?, + content: opt(&mut value, "content", into_string)?, nonce: remove(&mut value, "nonce").and_then(into_string).ok(), tts: remove(&mut value, "tts").ok().and_then(|v| v.as_bool()), pinned: remove(&mut value, "pinned").ok().and_then(|v| v.as_bool()), - timestamp: try!(opt(&mut value, "timestamp", into_string)), - edited_timestamp: try!(opt(&mut value, "edited_timestamp", into_string)), - author: try!(opt(&mut value, "author", User::decode)), + timestamp: opt(&mut value, "timestamp", into_string)?, + edited_timestamp: opt(&mut value, "edited_timestamp", into_string)?, + author: opt(&mut value, "author", User::decode)?, mention_everyone: remove(&mut value, "mention_everyone").ok().and_then(|v| v.as_bool()), - mentions: try!(opt(&mut value, "mentions", |v| decode_array(v, User::decode))), - mention_roles: try!(opt(&mut value, "mention_roles", |v| decode_array(v, RoleId::decode))), - attachments: try!(opt(&mut value, "attachments", |v| decode_array(v, Attachment::decode))), - embeds: try!(opt(&mut value, "embeds", |v| decode_array(v, Ok))), + mentions: opt(&mut value, "mentions", |v| decode_array(v, User::decode))?, + mention_roles: opt(&mut value, "mention_roles", |v| decode_array(v, RoleId::decode))?, + attachments: opt(&mut value, "attachments", |v| decode_array(v, Attachment::decode))?, + embeds: opt(&mut value, "embeds", |v| decode_array(v, Ok))?, })) } else if kind == "PRESENCE_UPDATE" { - let guild_id = try!(opt(&mut value, "guild_id", GuildId::decode)); - let roles = try!(opt(&mut value, "roles", |v| decode_array(v, RoleId::decode))); - let presence = try!(Presence::decode(Value::Object(value))); + let guild_id = opt(&mut value, "guild_id", GuildId::decode)?; + let roles = opt(&mut value, "roles", |v| decode_array(v, RoleId::decode))?; + let presence = Presence::decode(Value::Object(value))?; Ok(Event::PresenceUpdate(PresenceUpdateEvent { guild_id: guild_id, presence: presence, @@ -688,70 +688,70 @@ impl Event { })) } else if kind == "RELATIONSHIP_ADD" { Ok(Event::RelationshipAdd(RelationshipAddEvent { - relationship: try!(Relationship::decode(Value::Object(value))), + relationship: Relationship::decode(Value::Object(value))?, })) } else if kind == "RELATIONSHIP_REMOVE" { Ok(Event::RelationshipRemove(RelationshipRemoveEvent { - kind: try!(remove(&mut value, "type").and_then(RelationshipType::decode)), - user_id: try!(remove(&mut value, "id").and_then(UserId::decode)), + kind: remove(&mut value, "type").and_then(RelationshipType::decode)?, + user_id: remove(&mut value, "id").and_then(UserId::decode)?, })) } else if kind == "READY" { Ok(Event::Ready(ReadyEvent { - ready: try!(Ready::decode(Value::Object(value))), + ready: Ready::decode(Value::Object(value))?, })) } else if kind == "RESUMED" { Ok(Event::Resumed(ResumedEvent { - heartbeat_interval: req!(try!(remove(&mut value, "heartbeat_interval")).as_u64()), - trace: try!(remove(&mut value, "_trace").and_then(|v| decode_array(v, |v| Ok(into_string(v).ok())))), + heartbeat_interval: req!(remove(&mut value, "heartbeat_interval")?.as_u64()), + trace: remove(&mut value, "_trace").and_then(|v| decode_array(v, |v| Ok(into_string(v).ok())))?, })) } else if kind == "TYPING_START" { Ok(Event::TypingStart(TypingStartEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - timestamp: req!(try!(remove(&mut value, "timestamp")).as_u64()), - user_id: try!(remove(&mut value, "user_id").and_then(UserId::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + timestamp: req!(remove(&mut value, "timestamp")?.as_u64()), + user_id: remove(&mut value, "user_id").and_then(UserId::decode)?, })) } else if kind == "USER_GUILD_SETTINGS_UPDATE" { Ok(Event::UserGuildSettingsUpdate(UserGuildSettingsUpdateEvent { - settings: try!(UserGuildSettings::decode(Value::Object(value))), + settings: UserGuildSettings::decode(Value::Object(value))?, })) } else if kind == "USER_NOTE_UPDATE" { Ok(Event::UserNoteUpdate(UserNoteUpdateEvent { - note: try!(remove(&mut value, "note").and_then(into_string)), - user_id: try!(remove(&mut value, "id").and_then(UserId::decode)), + note: remove(&mut value, "note").and_then(into_string)?, + user_id: remove(&mut value, "id").and_then(UserId::decode)?, })) } else if kind == "USER_SETTINGS_UPDATE" { Ok(Event::UserSettingsUpdate(UserSettingsUpdateEvent { enable_tts_command: remove(&mut value, "enable_tts_command").ok().and_then(|v| v.as_bool()), inline_attachment_media: remove(&mut value, "inline_attachment_media").ok().and_then(|v| v.as_bool()), inline_embed_media: remove(&mut value, "inline_embed_media").ok().and_then(|v| v.as_bool()), - locale: try!(opt(&mut value, "locale", into_string)), + locale: opt(&mut value, "locale", into_string)?, message_display_compact: remove(&mut value, "message_display_compact").ok().and_then(|v| v.as_bool()), render_embeds: remove(&mut value, "render_embeds").ok().and_then(|v| v.as_bool()), show_current_game: remove(&mut value, "show_current_game").ok().and_then(|v| v.as_bool()), - theme: try!(opt(&mut value, "theme", into_string)), + theme: opt(&mut value, "theme", into_string)?, convert_emoticons: remove(&mut value, "convert_emoticons").ok().and_then(|v| v.as_bool()), - friend_source_flags: try!(opt(&mut value, "friend_source_flags", FriendSourceFlags::decode)), + friend_source_flags: opt(&mut value, "friend_source_flags", FriendSourceFlags::decode)?, })) } else if kind == "USER_UPDATE" { Ok(Event::UserUpdate(UserUpdateEvent { - current_user: try!(CurrentUser::decode(Value::Object(value))), + current_user: CurrentUser::decode(Value::Object(value))?, })) } else if kind == "VOICE_SERVER_UPDATE" { Ok(Event::VoiceServerUpdate(VoiceServerUpdateEvent { - guild_id: try!(opt(&mut value, "guild_id", GuildId::decode)), - channel_id: try!(opt(&mut value, "channel_id", ChannelId::decode)), - endpoint: try!(opt(&mut value, "endpoint", into_string)), - token: try!(remove(&mut value, "token").and_then(into_string)), + guild_id: opt(&mut value, "guild_id", GuildId::decode)?, + channel_id: opt(&mut value, "channel_id", ChannelId::decode)?, + endpoint: opt(&mut value, "endpoint", into_string)?, + token: remove(&mut value, "token").and_then(into_string)?, })) } else if kind == "VOICE_STATE_UPDATE" { Ok(Event::VoiceStateUpdate(VoiceStateUpdateEvent { - guild_id: try!(opt(&mut value, "guild_id", GuildId::decode)), - voice_state: try!(VoiceState::decode(Value::Object(value))), + guild_id: opt(&mut value, "guild_id", GuildId::decode)?, + voice_state: VoiceState::decode(Value::Object(value))?, })) } else if kind == "WEBHOOKS_UPDATE" { Ok(Event::WebhookUpdate(WebhookUpdateEvent { - channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)), - guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)), + channel_id: remove(&mut value, "channel_id").and_then(ChannelId::decode)?, + guild_id: remove(&mut value, "guild_id").and_then(GuildId::decode)?, })) } else { Ok(Event::Unknown(UnknownEvent { @@ -801,47 +801,47 @@ pub enum VoiceEvent { impl VoiceEvent { pub fn decode(value: Value) -> Result<VoiceEvent> { - let mut value = try!(into_map(value)); - let op = req!(try!(remove(&mut value, "op")).as_u64()); - let mut map = try!(remove(&mut value, "d").and_then(into_map)); + let mut value = into_map(value)?; + let op = req!(remove(&mut value, "op")?.as_u64()); + let mut map = remove(&mut value, "d").and_then(into_map)?; - let opcode = try!(VoiceOpCode::from_num(op) - .ok_or(Error::Client(ClientError::InvalidOpCode))); + let opcode = VoiceOpCode::from_num(op) + .ok_or(Error::Client(ClientError::InvalidOpCode))?; match opcode { VoiceOpCode::Heartbeat => { Ok(VoiceEvent::Heartbeat(VoiceHeartbeat { - heartbeat_interval: req!(try!(remove(&mut map, "heartbeat_interval")).as_u64()), + heartbeat_interval: req!(remove(&mut map, "heartbeat_interval")?.as_u64()), })) }, VoiceOpCode::Hello => { Ok(VoiceEvent::Hello(VoiceHello { - heartbeat_interval: req!(try!(remove(&mut map, "heartbeat_interval")) + heartbeat_interval: req!(remove(&mut map, "heartbeat_interval")? .as_u64()), - ip: try!(remove(&mut map, "ip").and_then(into_string)), - modes: try!(decode_array(try!(remove(&mut map, "modes")), - into_string)), - port: req!(try!(remove(&mut map, "port")) + ip: remove(&mut map, "ip").and_then(into_string)?, + modes: decode_array(remove(&mut map, "modes")?, + into_string)?, + port: req!(remove(&mut map, "port")? .as_u64()) as u16, - ssrc: req!(try!(remove(&mut map, "ssrc")) + ssrc: req!(remove(&mut map, "ssrc")? .as_u64()) as u32, })) }, VoiceOpCode::KeepAlive => Ok(VoiceEvent::KeepAlive), VoiceOpCode::SessionDescription => { Ok(VoiceEvent::Ready(VoiceReady { - mode: try!(remove(&mut map, "mode") - .and_then(into_string)), - secret_key: try!(decode_array(try!(remove(&mut map, "secret_key")), + mode: remove(&mut map, "mode") + .and_then(into_string)?, + secret_key: decode_array(remove(&mut map, "secret_key")?, |v| Ok(req!(v.as_u64()) as u8) - )), + )?, })) }, VoiceOpCode::Speaking => { Ok(VoiceEvent::Speaking(VoiceSpeaking { - speaking: req!(try!(remove(&mut map, "speaking")).as_bool()), - ssrc: req!(try!(remove(&mut map, "ssrc")).as_u64()) as u32, - user_id: try!(remove(&mut map, "user_id").and_then(UserId::decode)), + speaking: req!(remove(&mut map, "speaking")?.as_bool()), + ssrc: req!(remove(&mut map, "ssrc")?.as_u64()) as u32, + user_id: remove(&mut map, "user_id").and_then(UserId::decode)?, })) } other => Ok(VoiceEvent::Unknown(other, Value::Object(map))), diff --git a/src/model/gateway.rs b/src/model/gateway.rs index 0b64e24..67a9a42 100644 --- a/src/model/gateway.rs +++ b/src/model/gateway.rs @@ -29,11 +29,11 @@ impl Game { #[doc(hidden)] pub fn decode(value: Value) -> Result<Option<Game>> { - let mut map = try!(into_map(value)); + let mut map = into_map(value)?; let name = match map.remove("name") { Some(Value::Null) | None => return Ok(None), - Some(v) => try!(into_string(v)), + Some(v) => into_string(v)?, }; if name.trim().is_empty() { @@ -42,8 +42,8 @@ impl Game { Ok(Some(Game { name: name, - kind: try!(opt(&mut map, "type", GameType::decode)).unwrap_or(GameType::Playing), - url: try!(opt(&mut map, "url", into_string)), + kind: opt(&mut map, "type", GameType::decode)?.unwrap_or(GameType::Playing), + url: opt(&mut map, "url", into_string)?, })) } } @@ -51,28 +51,28 @@ impl Game { impl Presence { #[doc(hidden)] pub fn decode(value: Value) -> Result<Presence> { - let mut value = try!(into_map(value)); - let mut user_map = try!(remove(&mut value, "user").and_then(into_map)); + let mut value = into_map(value)?; + let mut user_map = remove(&mut value, "user").and_then(into_map)?; let (user_id, user) = if user_map.len() > 1 { - let user = try!(User::decode(Value::Object(user_map))); + let user = User::decode(Value::Object(user_map))?; (user.id, Some(user)) } else { - (try!(remove(&mut user_map, "id").and_then(UserId::decode)), None) + (remove(&mut user_map, "id").and_then(UserId::decode)?, None) }; let game = match value.remove("game") { None | Some(Value::Null) => None, - Some(v) => try!(Game::decode(v)), + Some(v) => Game::decode(v)?, }; Ok(Presence { user_id: user_id, - status: try!(remove(&mut value, "status").and_then(OnlineStatus::decode_str)), - last_modified: try!(opt(&mut value, "last_modified", |v| Ok(req!(v.as_u64())))), + status: remove(&mut value, "status").and_then(OnlineStatus::decode_str)?, + last_modified: opt(&mut value, "last_modified", |v| Ok(req!(v.as_u64())))?, game: game, user: user, - nick: try!(opt(&mut value, "nick", into_string)), + nick: opt(&mut value, "nick", into_string)?, }) } } diff --git a/src/model/guild.rs b/src/model/guild.rs index f11cc80..d0627eb 100644 --- a/src/model/guild.rs +++ b/src/model/guild.rs @@ -112,10 +112,10 @@ impl fmt::Display for Emoji { /// /// This is in the format of: `<:NAME:EMOJI_ID>`. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - try!(f.write_str("<:")); - try!(f.write_str(&self.name)); - try!(fmt::Write::write_char(f, ':')); - try!(fmt::Display::fmt(&self.id, f)); + f.write_str("<:")?; + f.write_str(&self.name)?; + fmt::Write::write_char(f, ':')?; + fmt::Display::fmt(&self.id, f)?; fmt::Write::write_char(f, '>') } } @@ -222,7 +222,7 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::BAN_MEMBERS; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -247,7 +247,7 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::BAN_MEMBERS; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -283,7 +283,7 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::MANAGE_CHANNELS; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -317,12 +317,12 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::MANAGE_ROLES; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} - let role = try!(rest::create_role(self.id.0)); + let role = rest::create_role(self.id.0)?; let map = f(EditRole::new(&role)).0.build(); rest::edit_role(self.id.0, role.id.0, map) @@ -330,15 +330,15 @@ impl Guild { #[doc(hidden)] pub fn decode(value: Value) -> Result<Guild> { - let mut map = try!(into_map(value)); + let mut map = into_map(value)?; - let id = try!(remove(&mut map, "id").and_then(GuildId::decode)); + let id = remove(&mut map, "id").and_then(GuildId::decode)?; let public_channels = { let mut public_channels = HashMap::new(); - let vals = try!(decode_array(try!(remove(&mut map, "channels")), - |v| GuildChannel::decode_guild(v, id))); + let vals = decode_array(remove(&mut map, "channels")?, + |v| GuildChannel::decode_guild(v, id))?; for public_channel in vals { public_channels.insert(public_channel.id, public_channel); @@ -348,27 +348,27 @@ impl Guild { }; Ok(Guild { - afk_channel_id: try!(opt(&mut map, "afk_channel_id", ChannelId::decode)), - afk_timeout: req!(try!(remove(&mut map, "afk_timeout")).as_u64()), + afk_channel_id: opt(&mut map, "afk_channel_id", ChannelId::decode)?, + afk_timeout: req!(remove(&mut map, "afk_timeout")?.as_u64()), channels: public_channels, - default_message_notifications: req!(try!(remove(&mut map, "default_message_notifications")).as_u64()), - emojis: try!(remove(&mut map, "emojis").and_then(decode_emojis)), - features: try!(remove(&mut map, "features").and_then(|v| decode_array(v, Feature::decode_str))), - icon: try!(opt(&mut map, "icon", into_string)), + default_message_notifications: req!(remove(&mut map, "default_message_notifications")?.as_u64()), + emojis: remove(&mut map, "emojis").and_then(decode_emojis)?, + features: remove(&mut map, "features").and_then(|v| decode_array(v, Feature::decode_str))?, + icon: opt(&mut map, "icon", into_string)?, id: id, - joined_at: try!(remove(&mut map, "joined_at").and_then(into_string)), - large: req!(try!(remove(&mut map, "large")).as_bool()), - member_count: req!(try!(remove(&mut map, "member_count")).as_u64()), - members: try!(remove(&mut map, "members").and_then(decode_members)), - mfa_level: req!(try!(remove(&mut map, "mfa_level")).as_u64()), - name: try!(remove(&mut map, "name").and_then(into_string)), - owner_id: try!(remove(&mut map, "owner_id").and_then(UserId::decode)), - presences: try!(remove(&mut map, "presences").and_then(decode_presences)), - region: try!(remove(&mut map, "region").and_then(into_string)), - roles: try!(remove(&mut map, "roles").and_then(decode_roles)), - splash: try!(opt(&mut map, "splash", into_string)), - verification_level: try!(remove(&mut map, "verification_level").and_then(VerificationLevel::decode)), - voice_states: try!(remove(&mut map, "voice_states").and_then(decode_voice_states)), + joined_at: remove(&mut map, "joined_at").and_then(into_string)?, + large: req!(remove(&mut map, "large")?.as_bool()), + member_count: req!(remove(&mut map, "member_count")?.as_u64()), + members: remove(&mut map, "members").and_then(decode_members)?, + mfa_level: req!(remove(&mut map, "mfa_level")?.as_u64()), + name: remove(&mut map, "name").and_then(into_string)?, + owner_id: remove(&mut map, "owner_id").and_then(UserId::decode)?, + presences: remove(&mut map, "presences").and_then(decode_presences)?, + region: remove(&mut map, "region").and_then(into_string)?, + roles: remove(&mut map, "roles").and_then(decode_roles)?, + splash: opt(&mut map, "splash", into_string)?, + verification_level: remove(&mut map, "verification_level").and_then(VerificationLevel::decode)?, + voice_states: remove(&mut map, "voice_states").and_then(decode_voice_states)?, }) } @@ -417,7 +417,7 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::MANAGE_GUILD; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -465,7 +465,7 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::CHANGE_NICKNAME; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -497,7 +497,7 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::MANAGE_GUILD; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -701,7 +701,7 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::KICK_MEMBERS; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -733,7 +733,7 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::KICK_MEMBERS; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -762,7 +762,7 @@ impl Guild { feature_cache_enabled! {{ let req = permissions::BAN_MEMBERS; - if !try!(self.has_perms(req)) { + if !self.has_perms(req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -798,7 +798,7 @@ impl Member { return Ok(()); } - let guild_id = try!(self.find_guild()); + let guild_id = self.find_guild()?; match rest::add_member_role(guild_id.0, self.user.id.0, role_id.0) { Ok(()) => { @@ -819,7 +819,7 @@ impl Member { /// [Manage Roles]: permissions/constant.MANAGE_ROLES.html #[cfg(all(feature = "cache", feature = "methods"))] pub fn add_roles(&mut self, role_ids: &[RoleId]) -> Result<()> { - let guild_id = try!(self.find_guild()); + let guild_id = self.find_guild()?; self.roles.extend_from_slice(role_ids); let map = EditMember::default().roles(&self.roles).0.build(); @@ -842,7 +842,7 @@ impl Member { /// [Ban Members]: permissions/constant.BAN_MEMBERS.html #[cfg(all(feature = "cache", feature = "methods"))] pub fn ban(&self, delete_message_days: u8) -> Result<()> { - let guild_id = try!(self.find_guild()); + let guild_id = self.find_guild()?; rest::ban_user(guild_id.0, self.user.id.0, @@ -892,7 +892,7 @@ impl Member { #[cfg(all(feature = "cache", feature = "methods"))] pub fn edit<F>(&self, f: F) -> Result<()> where F: FnOnce(EditMember) -> EditMember { - let guild_id = try!(self.find_guild()); + let guild_id = self.find_guild()?; let map = f(EditMember::default()).0.build(); rest::edit_member(guild_id.0, self.user.id.0, map) @@ -936,7 +936,7 @@ impl Member { return Ok(()); } - let guild_id = try!(self.find_guild()); + let guild_id = self.find_guild()?; match rest::remove_member_role(guild_id.0, self.user.id.0, role_id.0) { Ok(()) => { @@ -956,7 +956,7 @@ impl Member { /// [Manage Roles]: permissions/constant.MANAGE_ROLES.html #[cfg(all(feature = "cache", feature = "methods"))] pub fn remove_roles(&mut self, role_ids: &[RoleId]) -> Result<()> { - let guild_id = try!(self.find_guild()); + let guild_id = self.find_guild()?; self.roles.retain(|r| !role_ids.contains(r)); let map = EditMember::default().roles(&self.roles).0.build(); @@ -1011,7 +1011,7 @@ impl fmt::Display for Member { impl PossibleGuild<Guild> { #[doc(hidden)] pub fn decode(value: Value) -> Result<Self> { - let mut value = try!(into_map(value)); + let mut value = into_map(value)?; if remove(&mut value, "unavailable").ok().and_then(|v| v.as_bool()).unwrap_or(false) { remove(&mut value, "id").and_then(GuildId::decode).map(PossibleGuild::Offline) } else { @@ -1033,7 +1033,7 @@ impl PossibleGuild<Guild> { impl PossibleGuild<PartialGuild> { #[doc(hidden)] pub fn decode(value: Value) -> Result<Self> { - let mut value = try!(into_map(value)); + let mut value = into_map(value)?; if remove(&mut value, "unavailable").ok().and_then(|v| v.as_bool()).unwrap_or(false) { remove(&mut value, "id").and_then(GuildId::decode).map(PossibleGuild::Offline) } else { @@ -1060,7 +1060,7 @@ impl Role { /// [Manage Roles]: permissions/constant.MANAGE_ROLES.html #[cfg(all(feature = "cache", feature = "methods"))] pub fn delete(&self) -> Result<()> { - let guild_id = try!(self.find_guild()); + let guild_id = self.find_guild()?; rest::delete_role(guild_id.0, self.id.0) } diff --git a/src/model/invite.rs b/src/model/invite.rs index c05b4d4..64fa44d 100644 --- a/src/model/invite.rs +++ b/src/model/invite.rs @@ -55,7 +55,7 @@ impl Invite { feature_cache_enabled! {{ let req = permissions::MANAGE_GUILD; - if !try!(utils::user_has_perms(self.channel.id, req)) { + if !utils::user_has_perms(self.channel.id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} @@ -117,7 +117,7 @@ impl RichInvite { let req = permissions::MANAGE_GUILD; feature_cache_enabled! {{ - if !try!(utils::user_has_perms(self.channel.id, req)) { + if !utils::user_has_perms(self.channel.id, req)? { return Err(Error::Client(ClientError::InvalidPermissions(req))); } }} diff --git a/src/model/mod.rs b/src/model/mod.rs index b5eda3c..298912f 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -26,7 +26,6 @@ mod guild; mod id; mod misc; mod user; -mod voice; #[cfg(feature = "methods")] mod invite; @@ -40,7 +39,6 @@ pub use self::id::*; pub use self::misc::*; pub use self::permissions::Permissions; pub use self::user::*; -pub use self::voice::*; #[cfg(feature = "methods")] pub use self::invite::*; diff --git a/src/model/user.rs b/src/model/user.rs index da50e46..f5906ab 100644 --- a/src/model/user.rs +++ b/src/model/user.rs @@ -133,14 +133,14 @@ impl User { .insert("recipient_id", self.id.0) .build(); - try!(rest::create_private_channel(map)).id + rest::create_private_channel(map)?.id } } else { let map = ObjectBuilder::new() .insert("recipient_id", self.id.0) .build(); - try!(rest::create_private_channel(map)).id + rest::create_private_channel(map)?.id }}; let map = ObjectBuilder::new() @@ -210,24 +210,24 @@ impl fmt::Display for User { impl UserSettings { #[doc(hidden)] pub fn decode(value: Value) -> Result<Option<UserSettings>> { - let mut map = try!(into_map(value)); + let mut map = into_map(value)?; if map.is_empty() { return Ok(None); } Ok(UserSettings { - convert_emoticons: req!(try!(remove(&mut map, "convert_emoticons")).as_bool()), - enable_tts_command: req!(try!(remove(&mut map, "enable_tts_command")).as_bool()), - friend_source_flags: try!(remove(&mut map, "friend_source_flags").and_then(FriendSourceFlags::decode)), - inline_attachment_media: req!(try!(remove(&mut map, "inline_attachment_media")).as_bool()), - inline_embed_media: req!(try!(remove(&mut map, "inline_embed_media")).as_bool()), - locale: try!(remove(&mut map, "locale").and_then(into_string)), - message_display_compact: req!(try!(remove(&mut map, "message_display_compact")).as_bool()), - render_embeds: req!(try!(remove(&mut map, "render_embeds")).as_bool()), - restricted_guilds: try!(remove(&mut map, "restricted_guilds").and_then(|v| decode_array(v, GuildId::decode))), - show_current_game: req!(try!(remove(&mut map, "show_current_game")).as_bool()), - theme: try!(remove(&mut map, "theme").and_then(into_string)), + convert_emoticons: req!(remove(&mut map, "convert_emoticons")?.as_bool()), + enable_tts_command: req!(remove(&mut map, "enable_tts_command")?.as_bool()), + friend_source_flags: remove(&mut map, "friend_source_flags").and_then(FriendSourceFlags::decode)?, + inline_attachment_media: req!(remove(&mut map, "inline_attachment_media")?.as_bool()), + inline_embed_media: req!(remove(&mut map, "inline_embed_media")?.as_bool()), + locale: remove(&mut map, "locale").and_then(into_string)?, + message_display_compact: req!(remove(&mut map, "message_display_compact")?.as_bool()), + render_embeds: req!(remove(&mut map, "render_embeds")?.as_bool()), + restricted_guilds: remove(&mut map, "restricted_guilds").and_then(|v| decode_array(v, GuildId::decode))?, + show_current_game: req!(remove(&mut map, "show_current_game")?.as_bool()), + theme: remove(&mut map, "theme").and_then(into_string)?, }).map(Some) } } diff --git a/src/model/utils.rs b/src/model/utils.rs index 9b4f6e4..2668142 100644 --- a/src/model/utils.rs +++ b/src/model/utils.rs @@ -27,18 +27,18 @@ use ::ext::cache::ChannelRef; #[macro_escape] macro_rules! req { ($opt:expr) => { - try!($opt.ok_or(Error::Decode(concat!("Type mismatch in model:", + $opt.ok_or(Error::Decode(concat!("Type mismatch in model:", line!(), ": ", stringify!($opt)), - Value::Null))) + Value::Null))? } } pub fn decode_emojis(value: Value) -> Result<HashMap<EmojiId, Emoji>> { let mut emojis = HashMap::new(); - for emoji in try!(decode_array(value, Emoji::decode)) { + for emoji in decode_array(value, Emoji::decode)? { emojis.insert(emoji.id, emoji); } @@ -91,7 +91,7 @@ pub fn decode_id(value: Value) -> Result<u64> { pub fn decode_members(value: Value) -> Result<HashMap<UserId, Member>> { let mut members = HashMap::new(); - for member in try!(decode_array(value, Member::decode)) { + for member in decode_array(value, Member::decode)? { members.insert(member.user.id, member); } @@ -104,11 +104,11 @@ pub fn decode_notes(value: Value) -> Result<HashMap<UserId, String>> { let mut notes = HashMap::new(); for (key, value) in into_map(value).unwrap_or(BTreeMap::default()) { - let id = UserId(try!(key.parse::<u64>() + let id = UserId(key.parse::<u64>() .map_err(|_| Error::Decode("Invalid user id in notes", - Value::String(key))))); + Value::String(key)))?); - notes.insert(id, try!(into_string(value))); + notes.insert(id, into_string(value)?); } Ok(notes) @@ -117,7 +117,7 @@ pub fn decode_notes(value: Value) -> Result<HashMap<UserId, String>> { pub fn decode_presences(value: Value) -> Result<HashMap<UserId, Presence>> { let mut presences = HashMap::new(); - for presence in try!(decode_array(value, Presence::decode)) { + for presence in decode_array(value, Presence::decode)? { presences.insert(presence.user_id, presence); } @@ -128,7 +128,7 @@ pub fn decode_private_channels(value: Value) -> Result<HashMap<ChannelId, Channel>> { let mut private_channels = HashMap::new(); - for private_channel in try!(decode_array(value, Channel::decode)) { + for private_channel in decode_array(value, Channel::decode)? { let id = match private_channel { Channel::Group(ref group) => group.channel_id, Channel::Private(ref channel) => channel.id, @@ -145,7 +145,7 @@ pub fn decode_read_states(value: Value) -> Result<HashMap<ChannelId, ReadState>> { let mut read_states = HashMap::new(); - for read_state in try!(decode_array(value, ReadState::decode)) { + for read_state in decode_array(value, ReadState::decode)? { read_states.insert(read_state.id, read_state); } @@ -156,7 +156,7 @@ pub fn decode_relationships(value: Value) -> Result<HashMap<UserId, Relationship>> { let mut relationships = HashMap::new(); - for relationship in try!(decode_array(value, Relationship::decode)) { + for relationship in decode_array(value, Relationship::decode)? { relationships.insert(relationship.id, relationship); } @@ -166,7 +166,7 @@ pub fn decode_relationships(value: Value) pub fn decode_roles(value: Value) -> Result<HashMap<RoleId, Role>> { let mut roles = HashMap::new(); - for role in try!(decode_array(value, Role::decode)) { + for role in decode_array(value, Role::decode)? { roles.insert(role.id, role); } @@ -174,20 +174,20 @@ pub fn decode_roles(value: Value) -> Result<HashMap<RoleId, Role>> { } pub fn decode_shards(value: Value) -> Result<[u8; 2]> { - let array = try!(into_array(value)); + let array = into_array(value)?; Ok([ - req!(try!(array.get(0) - .ok_or(Error::Client(ClientError::InvalidShards))).as_u64()) as u8, - req!(try!(array.get(1) - .ok_or(Error::Client(ClientError::InvalidShards))).as_u64()) as u8, + req!(array.get(0) + .ok_or(Error::Client(ClientError::InvalidShards))?.as_u64()) as u8, + req!(array.get(1) + .ok_or(Error::Client(ClientError::InvalidShards))?.as_u64()) as u8, ]) } pub fn decode_users(value: Value) -> Result<HashMap<UserId, User>> { let mut users = HashMap::new(); - for user in try!(decode_array(value, User::decode)) { + for user in decode_array(value, User::decode)? { users.insert(user.id, user); } @@ -198,7 +198,7 @@ pub fn decode_voice_states(value: Value) -> Result<HashMap<UserId, VoiceState>> { let mut voice_states = HashMap::new(); - for voice_state in try!(decode_array(value, VoiceState::decode)) { + for voice_state in decode_array(value, VoiceState::decode)? { voice_states.insert(voice_state.user_id, voice_state); } diff --git a/src/model/voice.rs b/src/model/voice.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/model/voice.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/utils/macros.rs b/src/utils/macros.rs index e8f74dd..2ba37e0 100644 --- a/src/utils/macros.rs +++ b/src/utils/macros.rs @@ -1,25 +1,25 @@ macro_rules! request { ($route:expr, $method:ident($body:expr), $url:expr, $($rest:tt)*) => {{ let client = HyperClient::new(); - try!(request($route, || client + request($route, || client .$method(&format!(api!($url), $($rest)*)) - .body(&$body))) + .body(&$body))? }}; ($route:expr, $method:ident($body:expr), $url:expr) => {{ let client = HyperClient::new(); - try!(request($route, || client + request($route, || client .$method(api!($url)) - .body(&$body))) + .body(&$body))? }}; ($route:expr, $method:ident, $url:expr, $($rest:tt)*) => {{ let client = HyperClient::new(); - try!(request($route, || client - .$method(&format!(api!($url), $($rest)*)))) + request($route, || client + .$method(&format!(api!($url), $($rest)*)))? }}; ($route:expr, $method:ident, $url:expr) => {{ let client = HyperClient::new(); - try!(request($route, || client - .$method(api!($url)))) + request($route, || client + .$method(api!($url)))? }}; } diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 2401a1b..a7a14a3 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -186,7 +186,7 @@ pub fn read_image<P: AsRef<Path>>(path: P) -> Result<String> { let path = path.as_ref(); let mut v = Vec::default(); - let mut f = try!(File::open(path)); + let mut f = File::open(path)?; let _ = f.read_to_end(&mut v); let b64 = base64::encode(&v); |