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
    }
}