quaint 0.1.13

An abstraction layer for SQL databases.
Documentation
use crate::error::Error;
use mysql_async as my;
use std::io::ErrorKind as IoErrorKind;

impl From<my::error::Error> for Error {
    fn from(e: my::error::Error) -> Error {
        use my::error::ServerError;

        match e {
            my::error::Error::Io(io_error) => match io_error.kind() {
                IoErrorKind::ConnectionRefused => Error::ConnectionError(io_error.into()),
                _ => Error::QueryError(io_error.into()),
            },
            my::error::Error::Driver(e) => Error::QueryError(e.into()),
            my::error::Error::Server(ServerError { ref message, code, .. }) if code == 1062 => {
                let splitted: Vec<&str> = message.split_whitespace().collect();
                let splitted: Vec<&str> = splitted.last().map(|s| s.split('\'').collect()).unwrap();
                let splitted: Vec<&str> = splitted[1].split('_').collect();

                let field_name: String = splitted[0].into();

                Error::UniqueConstraintViolation { field_name }
            }
            my::error::Error::Server(ServerError { ref message, code, .. }) if code == 1263 => {
                let splitted: Vec<&str> = message.split_whitespace().collect();
                let splitted: Vec<&str> = splitted.last().map(|s| s.split('\'').collect()).unwrap();
                let splitted: Vec<&str> = splitted[1].split('_').collect();

                let field_name: String = splitted[0].into();

                Error::NullConstraintViolation { field_name }
            }
            my::error::Error::Server(ServerError { ref message, code, .. }) if code == 1049 => {
                let splitted: Vec<&str> = message.split_whitespace().collect();
                let splitted: Vec<&str> = splitted.last().map(|s| s.split('\'').collect()).unwrap();
                let db_name: String = splitted[1].into();

                Error::DatabaseDoesNotExist { db_name }
            }
            my::error::Error::Server(ServerError { ref message, code, .. }) if code == 1007 => {
                let splitted: Vec<&str> = message.split_whitespace().collect();
                let splitted: Vec<&str> = splitted[3].split('\'').collect();
                let db_name: String = splitted[1].into();

                Error::DatabaseAlreadyExists { db_name }
            }
            my::error::Error::Server(ServerError { ref message, code, .. }) if code == 1044 => {
                let splitted: Vec<&str> = message.split_whitespace().collect();
                let splitted: Vec<&str> = splitted.last().map(|s| s.split('\'').collect()).unwrap();
                let db_name: String = splitted[1].into();

                Error::DatabaseAccessDenied { db_name }
            }
            my::error::Error::Server(ServerError { ref message, code, .. }) if code == 1045 => {
                let splitted: Vec<&str> = message.split_whitespace().collect();
                let splitted: Vec<&str> = splitted[4].split('@').collect();
                let splitted: Vec<&str> = splitted[0].split('\'').collect();
                let user: String = splitted[1].into();

                Error::AuthenticationFailed { user }
            }
            e => Error::QueryError(e.into()),
        }
    }
}