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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
use std::collections::HashMap; use libc; use td_rp::Value; use td_rlua::{self, LuaPush, lua_State}; pub struct LuaWrapperValue(pub Value); impl LuaPush for LuaWrapperValue { fn push_to_lua(self, lua: *mut lua_State) -> i32 { match self.0 { Value::Nil => ().push_to_lua(lua), Value::U8(val) => val.push_to_lua(lua), Value::I8(val) => val.push_to_lua(lua), Value::U16(val) => val.push_to_lua(lua), Value::I16(val) => val.push_to_lua(lua), Value::U32(val) => val.push_to_lua(lua), Value::I32(val) => val.push_to_lua(lua), Value::Float(val) => val.push_to_lua(lua), Value::Str(val) => val.push_to_lua(lua), Value::Raw(val) => { unsafe { td_rlua::lua_pushlstring(lua, val.as_ptr() as *const libc::c_char, val.len()) }; 1 } Value::Map(mut val) => { let mut wrapper_val: HashMap<String, LuaWrapperValue> = HashMap::new(); for (k, v) in val.drain() { wrapper_val.insert(k, LuaWrapperValue(v)); } wrapper_val.push_to_lua(lua) } Value::AU8(mut val) | Value::AI8(mut val) | Value::AU16(mut val) | Value::AI16(mut val) | Value::AU32(mut val) | Value::AI32(mut val) | Value::AFloat(mut val) | Value::AStr(mut val) | Value::ARaw(mut val) | Value::AMap(mut val) => { let mut wrapper_val: Vec<LuaWrapperValue> = vec![]; for v in val.drain(..) { wrapper_val.push(LuaWrapperValue(v)); } wrapper_val.push_to_lua(lua) } } } } pub struct LuaWrapperVecValue(pub Vec<Value>); impl LuaPush for LuaWrapperVecValue { fn push_to_lua(mut self, lua: *mut lua_State) -> i32 { let mut index = 0; for v in self.0.drain(..) { index = LuaWrapperValue(v).push_to_lua(lua); } index } } pub struct LuaWrapperTableValue(pub Vec<Value>); impl LuaPush for LuaWrapperTableValue { fn push_to_lua(mut self, lua: *mut lua_State) -> i32 { unsafe { td_rlua::lua_newtable(lua); for (i, v) in self.0.drain(..).enumerate() { td_rlua::lua_pushnumber(lua, (i + 1) as f64); LuaWrapperValue(v).push_to_lua(lua); td_rlua::lua_settable(lua, -3); } } 1 } }