diff options
| author | Zeyla Hellyer <[email protected]> | 2017-05-22 17:02:00 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-05-22 17:02:00 -0700 |
| commit | 9969be60cf320797c37b317da24d9a08fd5eafa5 (patch) | |
| tree | f27bf7a57af95bbc11990b1edcea9cca99276964 /src/model/error.rs | |
| parent | Reasonably derive Debug on items (diff) | |
| download | serenity-9969be60cf320797c37b317da24d9a08fd5eafa5.tar.xz serenity-9969be60cf320797c37b317da24d9a08fd5eafa5.zip | |
Restructure modules
Modules are now separated into a fashion where the library can be used
for most use cases, without needing to compile the rest.
The core of serenity, with no features enabled, contains only the
struct (model) definitions, constants, and prelude. Models do not have
most functions compiled in, as that is separated into the `model`
feature.
The `client` module has been split into 3 modules: `client`, `gateway`,
and `http`.
`http` contains functions to interact with the REST API. `gateway`
contains the Shard to interact with the gateway, requiring `http` for
retrieving the gateway URL. `client` requires both of the other features
and acts as an abstracted interface over both the gateway and REST APIs,
handling the event loop.
The `builder` module has been separated from `utils`, and can now be
optionally compiled in. It and the `http` feature are required by the
`model` feature due to a large number of methods requiring access to
them.
`utils` now contains a number of utilities, such as the Colour struct, the
`MessageBuilder`, and mention parsing functions.
Each of the original `ext` modules are still featured, with `cache` not
requiring any feature to be enabled, `framework` requiring the `client`,
`model`, and `utils`, and `voice` requiring `gateway`.
In total the features and their requirements are:
- `builder`: none
- `cache`: none
- `client`: `gateway`, `http`
- `framework`: `client`, `model`, `utils`
- `gateway`: `http`
- `http`: none
- `model`: `builder`, `http`
- `utils`: none
- `voice`: `gateway`
The default features are `builder`, `cache`, `client`, `framework`,
`gateway`, `model`, `http`, and `utils`.
To help with forwards compatibility, modules have been re-exported from
their original locations.
Diffstat (limited to 'src/model/error.rs')
| -rw-r--r-- | src/model/error.rs | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/model/error.rs b/src/model/error.rs new file mode 100644 index 0000000..6d0295b --- /dev/null +++ b/src/model/error.rs @@ -0,0 +1,109 @@ +use std::error::Error as StdError; +use std::fmt::{Display, Formatter, Result as FmtResult}; +use super::Permissions; + +/// An error returned from the [`model`] module. +/// +/// This is always wrapped within the library's [`Error::Model`] variant. +/// +/// # Examples +/// +/// Matching an [`Error`] with this variant would look something like the +/// following for the [`GuildId::ban`] method, which in this example is used to +/// re-ban all members with an odd discriminator: +/// +/// ```rust,no_run +/// use serenity::{Client, Error}; +/// use serenity::model::ModelError; +/// use std::env; +/// +/// let token = env::var("DISCORD_BOT_TOKEN").unwrap(); +/// let mut client = Client::login(&token); +/// +/// client.on_member_unban(|context, guild_id, user| { +/// // If the user has an even discriminator, don't re-ban them. +/// if user.discriminator % 2 == 0 { +/// return; +/// } +/// +/// match guild_id.ban(user, 8) { +/// Ok(()) => { +/// // Ban successful. +/// }, +/// Err(Error::Model(ModelError::DeleteMessageDaysAmount(amount))) => { +/// println!("Failed deleting {} days' worth of messages", amount); +/// }, +/// Err(why) => { +/// println!("Unexpected error: {:?}", why); +/// }, +/// } +/// }); +/// ``` +/// +/// [`Error`]: ../enum.Error.html +/// [`Error::Model`]: ../enum.Error.html#variant.Model +/// [`GuildId::ban`]: struct.GuildId.html#method.ban +#[derive(Clone, Debug, Eq, Hash, PartialEq)] +pub enum Error { + /// When attempting to delete below or above the minimum and maximum allowed + /// number of messages. + BulkDeleteAmount, + /// When attempting to delete a number of days' worth of messages that is + /// not allowed. + DeleteMessageDaysAmount(u8), + /// Indicates that the textual content of an embed exceeds the maximum + /// length. + EmbedTooLarge(u64), + /// An indication that a [guild][`Guild`] could not be found by + /// [Id][`GuildId`] in the [`Cache`]. + /// + /// [`Guild`]: ../model/struct.Guild.html + /// [`GuildId`]: ../model/struct.GuildId.html + /// [`Cache`]: ../cache/struct.Cache.html + GuildNotFound, + /// Indicates that you do not have the required permissions to perform an + /// operation. + /// + /// The provided [`Permission`]s is the set of required permissions + /// required. + /// + /// [`Permission`]: ../model/permissions/struct.Permissions.html + InvalidPermissions(Permissions), + /// An indicator that the [current user] can not perform an action. + /// + /// [current user]: ../model/struct.CurrentUser.html + InvalidUser, + /// An indicator that an item is missing from the [`Cache`], and the action + /// can not be continued. + /// + /// [`Cache`]: ../cache/struct.Cache.html + ItemMissing, + /// Indicates that a [`Message`]s content was too long and will not + /// successfully send, as the length is over 2000 codepoints, or 4000 bytes. + /// + /// The number of bytes larger than the limit is provided. + /// + /// [`Message`]: ../model/struct.Message.html + MessageTooLong(u64), +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter) -> FmtResult { + f.write_str(self.description()) + } +} + +impl StdError for Error { + fn description(&self) -> &str { + match *self { + Error::BulkDeleteAmount => "Too few/many messages to bulk delete", + Error::DeleteMessageDaysAmount(_) => "Invalid delete message days", + Error::EmbedTooLarge(_) => "Embed too large", + Error::GuildNotFound => "Guild not found in the cache", + Error::InvalidPermissions(_) => "Invalid permissions", + Error::InvalidUser => "The current user can not perform the action", + Error::ItemMissing => "The required item is missing from the cache", + Error::MessageTooLong(_) => "Message too large", + } + } +} |