sqlite 0.3.0

The package provides an interface to SQLite.
use raw;
use std::convert::{From, Into};
use std::fmt::{self, Display, Formatter};

use {Database, ResultCode};

/// An error.
#[derive(Debug)]
pub struct Error {
    pub code: ResultCode,
    pub message: Option<String>,
}

impl Error {
    /// Return the last occurred error if any.
    pub fn last(database: &mut Database) -> Option<Error> {
        unsafe {
            let code = raw::sqlite3_errcode(::database::as_raw(database));
            if code == raw::SQLITE_OK {
                return None;
            }
            let message = raw::sqlite3_errmsg(::database::as_raw(database));
            if message.is_null() {
                return None;
            }
            Some(Error {
                code: ::result::code_from_raw(code),
                message: Some(c_str_to_string!(message)),
            })
        }
    }
}

impl<T> From<T> for Error where T: Into<String> {
    #[inline]
    fn from(message: T) -> Error {
        Error {
            code: ResultCode::Error,
            message: Some(message.into()),
        }
    }
}

impl From<ResultCode> for Error {
    #[inline]
    fn from(code: ResultCode) -> Error {
        Error {
            code: code,
            message: None,
        }
    }
}

impl Display for Error {
    fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
        match self.message {
            Some(ref message) => Display::fmt(message, formatter),
            None => Display::fmt(&self.code, formatter),
        }
    }
}