From 8e3a9f0e843e5d82114e990f4985f37ed825b181 Mon Sep 17 00:00:00 2001 From: kyren Date: Fri, 23 Jun 2017 15:24:03 -0400 Subject: [PATCH] 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. --- src/conversion.rs | 13 +++++++++++++ src/lua.rs | 3 +++ 2 files changed, 16 insertions(+) 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 { } } } + +impl LuaUserDataType for LuaError { + fn add_methods(methods: &mut LuaUserDataMethods) { + 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(