diff options
author | kyren <kerriganw@gmail.com> | 2017-06-23 15:24:03 -0400 |
---|---|---|
committer | kyren <kerriganw@gmail.com> | 2017-06-23 15:24:03 -0400 |
commit | 8e3a9f0e843e5d82114e990f4985f37ed825b181 (patch) | |
tree | 5e8b8f3cc7c89ab6f903ae337fe784e41d21db68 | |
parent | 7b7f7f36fc40af8c1c146b9149ba48e103588eac (diff) | |
download | mlua-8e3a9f0e843e5d82114e990f4985f37ed825b181.zip |
Add ToString metamethod, make LuaError implement LuaUserData
LuaError implementing LuaUserData makes it easy to return LuaResult from a
callback to implement callback functions that can error.
-rw-r--r-- | src/conversion.rs | 13 | ||||
-rw-r--r-- | src/lua.rs | 3 |
2 files changed, 16 insertions, 0 deletions
diff --git a/src/conversion.rs b/src/conversion.rs index 5ef0050..c6e74f1 100644 --- a/src/conversion.rs +++ b/src/conversion.rs @@ -1,5 +1,6 @@ use std::collections::{HashMap, BTreeMap}; use std::hash::Hash; +use error_chain::ChainedError; use error::*; use lua::*; @@ -263,3 +264,15 @@ impl<'lua, T: FromLua<'lua>> FromLua<'lua> for Option<T> { } } } + +impl LuaUserDataType for LuaError { + fn add_methods(methods: &mut LuaUserDataMethods<Self>) { + methods.add_method("backtrace", |lua, err, _| { + lua.pack(format!("{}", err.display())) + }); + + methods.add_meta_method(LuaMetaMethod::ToString, |lua, err, _| { + lua.pack(err.to_string()) + }); + } +} @@ -748,6 +748,8 @@ pub enum LuaMetaMethod { NewIndex, /// The call "operator" `obj(arg1, args2, ...)`. Call, + /// tostring(ud) will call this if it exists + ToString, } /// Stores methods of a userdata object. @@ -1571,6 +1573,7 @@ impl Lua { LuaMetaMethod::Index => "__index", LuaMetaMethod::NewIndex => "__newIndex", LuaMetaMethod::Call => "__call", + LuaMetaMethod::ToString => "__tostring", }; push_string(self.state, name); self.push_value( |