summaryrefslogtreecommitdiff
path: root/src/error.rs
blob: a5c2ed895cd32992de1d7968061f6020732c0c32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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 {
        ScriptError(err: String)
        IncompleteStatement(err: String)
    }

    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>
    where E: 'static + Error + Send
{
    fn to_lua_err(self) -> LuaResult<T> {
        self.map_err(|e| LuaExternalError(Box::new(e)).into())
    }
}