feat(core): add DatabaseError

This commit is contained in:
Ryan Leckey 2021-01-02 10:46:51 -08:00
parent 4d63978da1
commit 2195472e3e
No known key found for this signature in database
GPG Key ID: F8AA68C235AB08C9
4 changed files with 55 additions and 6 deletions

View File

@ -2,6 +2,10 @@ use std::borrow::Cow;
use std::error::Error as StdError;
use std::fmt::{self, Display, Formatter};
mod database;
pub use database::DatabaseError;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
@ -9,6 +13,8 @@ pub type Result<T> = std::result::Result<T, Error>;
pub enum Error {
Configuration { message: Cow<'static, str>, source: Option<Box<dyn StdError + Send + Sync>> },
Connect(Box<dyn DatabaseError>),
Network(std::io::Error),
}
@ -30,14 +36,16 @@ impl Error {
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::Network(source) => write!(f, "network: {}", source),
Self::Network(source) => write!(f, "{}", source),
Self::Connect(source) => write!(f, "{}", source),
Self::Configuration { message, source: None } => {
write!(f, "configuration: {}", message)
write!(f, "{}", message)
}
Self::Configuration { message, source: Some(source) } => {
write!(f, "configuration: {}: {}", message, source)
write!(f, "{}: {}", message, source)
}
}
}
@ -57,12 +65,12 @@ impl StdError for Error {
impl From<std::io::Error> for Error {
fn from(error: std::io::Error) -> Self {
Error::Network(error)
Self::Network(error)
}
}
impl From<std::io::ErrorKind> for Error {
fn from(error: std::io::ErrorKind) -> Self {
Error::Network(error.into())
Self::Network(error.into())
}
}

View File

@ -0,0 +1,13 @@
use std::error::Error as StdError;
/// `DatabaseError` is a trait representing an error that was returned from
/// the database.
///
/// Provides abstract access to information returned from the database about
/// the error.
///
#[allow(clippy::module_name_repetitions)]
pub trait DatabaseError: 'static + StdError + Send + Sync {
/// Returns the primary, human-readable error message.
fn message(&self) -> &str;
}

View File

@ -41,7 +41,7 @@ pub mod blocking;
pub use connection::Connection;
pub use database::{Database, HasOutput};
pub use error::{Error, Result};
pub use error::{Error, Result, DatabaseError};
pub use options::ConnectOptions;
#[cfg(feature = "actix")]
pub use runtime::Actix;

28
sqlx-mysql/src/error.rs Normal file
View File

@ -0,0 +1,28 @@
use std::error::Error as StdError;
use std::fmt::{self, Display, Formatter};
use sqlx_core::DatabaseError;
use crate::protocol::ErrPacket;
/// An error returned from the MySQL database server.
#[allow(clippy::module_name_repetitions)]
#[derive(Debug)]
pub struct MySqlDatabaseError(pub(crate) ErrPacket);
impl DatabaseError for MySqlDatabaseError {
fn message(&self) -> &str {
&self.0.error_message
}
}
impl Display for MySqlDatabaseError {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match &self.0.sql_state {
Some(state) => write!(f, "{} ({}): {}", self.0.error_code, state, self.message()),
None => write!(f, "{}: {}", self.0.error_code, self.message()),
}
}
}
impl StdError for MySqlDatabaseError {}