summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkyren <kerriganw@gmail.com>2017-06-23 15:24:03 -0400
committerkyren <kerriganw@gmail.com>2017-06-23 15:24:03 -0400
commit8e3a9f0e843e5d82114e990f4985f37ed825b181 (patch)
tree5e8b8f3cc7c89ab6f903ae337fe784e41d21db68 /src
parent7b7f7f36fc40af8c1c146b9149ba48e103588eac (diff)
downloadmlua-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.
Diffstat (limited to 'src')
-rw-r--r--src/conversion.rs13
-rw-r--r--src/lua.rs3
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())
+ });
+ }
+}
diff --git a/src/lua.rs b/src/lua.rs
index c776cfb..a194e2d 100644
--- a/src/lua.rs
+++ b/src/lua.rs
@@ -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(