2017-05-21 19:50:59 -04:00
|
|
|
use std::fmt;
|
|
|
|
use std::result::Result;
|
|
|
|
use std::error::Error;
|
|
|
|
use std::ffi::NulError;
|
|
|
|
use std::cell::{BorrowError, BorrowMutError};
|
|
|
|
use std::str::Utf8Error;
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct LuaExternalError(pub Box<Error + Send>);
|
|
|
|
|
|
|
|
impl fmt::Display for LuaExternalError {
|
|
|
|
fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
|
|
|
self.0.fmt(fmt)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Error for LuaExternalError {
|
|
|
|
fn description(&self) -> &str {
|
|
|
|
self.0.description()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn cause(&self) -> Option<&Error> {
|
|
|
|
self.0.cause()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
error_chain! {
|
|
|
|
types {
|
|
|
|
LuaError, LuaErrorKind, LuaResultExt, LuaResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
errors {
|
2017-05-22 14:24:19 -04:00
|
|
|
ScriptError(err: String) {
|
|
|
|
display("Error executing lua script {}", err)
|
|
|
|
}
|
|
|
|
CallbackError(err: String) {
|
|
|
|
display("Error during lua callback {}", err)
|
|
|
|
}
|
|
|
|
IncompleteStatement(err: String) {
|
|
|
|
display("Incomplete lua statement {}", err)
|
|
|
|
}
|
2017-05-21 19:50:59 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
foreign_links {
|
|
|
|
ExternalError(LuaExternalError);
|
|
|
|
Utf8Error(Utf8Error);
|
|
|
|
NulError(NulError);
|
|
|
|
BorrowError(BorrowError);
|
|
|
|
BorrowMutError(BorrowMutError);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Helper trait to convert external error types to a `LuaExternalError`
|
|
|
|
pub trait LuaExternalResult<T> {
|
|
|
|
fn to_lua_err(self) -> LuaResult<T>;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T, E> LuaExternalResult<T> for Result<T, E>
|
2017-06-15 10:26:39 -04:00
|
|
|
where
|
|
|
|
E: 'static + Error + Send,
|
2017-05-21 19:50:59 -04:00
|
|
|
{
|
|
|
|
fn to_lua_err(self) -> LuaResult<T> {
|
|
|
|
self.map_err(|e| LuaExternalError(Box::new(e)).into())
|
|
|
|
}
|
|
|
|
}
|