ezlua 0.5.4

Ergonomic, efficient and Zero-cost rust bindings to Lua5.4
Documentation
use super::*;
use tokio::net::{TcpListener, TcpStream};

impl UserData for TcpListener {
    fn getter(fields: UserdataRegistry<Self>) -> LuaResult<()> {
        fields.set_closure("local_addr", Self::local_addr)?;
        Ok(())
    }

    fn methods(methods: UserdataRegistry<Self>) -> LuaResult<()> {
        methods.set_async_closure("accept", Self::accept)?;
        Ok(())
    }

    fn metatable(mt: UserdataRegistry<Self>) -> LuaResult<()> {
        mt.set_async_closure("bind", Self::bind::<std::net::SocketAddr>)?;
        Ok(())
    }
}

impl UserData for TcpStream {
    fn getter(fields: UserdataRegistry<Self>) -> LuaResult<()> {
        fields.set_closure("local_addr", Self::local_addr)?;
        fields.set_closure("peer_addr", Self::peer_addr)?;
        Ok(())
    }

    fn methods(methods: UserdataRegistry<Self>) -> LuaResult<()> {
        Ok(())
    }
}

pub fn init(lua: &LuaState) -> LuaResult<LuaTable> {
    let m = lua.new_table()?;

    m.set("TcpListner", lua.register_usertype::<TcpListener>()?)?;
    m.set("TcpStream", lua.register_usertype::<TcpStream>()?)?;

    Ok(m)
}