tunm 0.2.1

game server for Rust
use td_rlua::{self, Lua, LuaPush};
use tunm_proto;
use super::EngineProtocol;
use {NetMsg, NetUtils};
use {NetResult, LuaWrapperTableValue};

pub struct ProtoRt;

impl EngineProtocol for ProtoRt {
    fn pack_protocol(lua: *mut td_rlua::lua_State, index: i32) -> Option<NetMsg> {
        let name: String = unwrap_or!(td_rlua::LuaRead::lua_read_at_position(lua, index), return None);
        let value = NetUtils::lua_convert_value(lua, index + 1);
        if value.is_none() {
            println!("data convert failed name = {:?}", name);
            return None;
        }
        let value = value.unwrap();
        let mut net_msg = NetMsg::new();
        unwrap_or!(tunm_proto::encode_proto(net_msg.get_buffer(), &name, value).ok(),
                   return None);
        net_msg.end_msg(0);
        if net_msg.len() > 0xFFFFFF {
            println!("pack message({}) size > 0xFFFF fail!", name);
            return None;
        }
        Some(net_msg)
    }

    fn unpack_protocol(lua: *mut td_rlua::lua_State, net_msg: &mut NetMsg) -> NetResult<i32> {
        net_msg.set_read_data();
        if let Ok((name, val)) = tunm_proto::decode_proto(net_msg.get_buffer()) {
            name.push_to_lua(lua);
            LuaWrapperTableValue(val).push_to_lua(lua);
            return Ok(2);
        } else {
            return Ok(0);
        }
    }

    fn convert_string(lua: *mut td_rlua::lua_State, net_msg: &mut NetMsg) -> NetResult<String> {
        net_msg.set_read_data();
        if let Ok((name, val)) = tunm_proto::decode_proto(net_msg.get_buffer()) {
            unsafe {
                td_rlua::lua_settop(lua, 0);
                name.push_to_lua(lua);
                LuaWrapperTableValue(val).push_to_lua(lua);
                let mut lua = Lua::from_existing_state(lua, false);
                let json: String = unwrap_or!(lua.exec_func("arg_to_encode"), return Ok("".to_string()));
                return Ok(json);
            }
        } else {
            return Ok("".to_string());
        }
    }
}