moved Lua structs to separate module
This commit is contained in:
parent
6ebdb441e1
commit
89d673b32f
|
|
@ -195,33 +195,6 @@ impl<Out: 'static> Ord for Client<Out>
|
|||
}
|
||||
}
|
||||
|
||||
pub struct ClientLua<Out: 'static>(pub Arc<Client<Out>>)
|
||||
where
|
||||
Out: From<ClientMessage> + Send;
|
||||
|
||||
impl<Out: 'static> LuaUserData for ClientLua<Out>
|
||||
where
|
||||
Out: From<ClientMessage> + Send
|
||||
{
|
||||
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||
fields.add_field_method_get("uuid", |_lua, this| {
|
||||
Ok(this.0.details.uuid.to_string())
|
||||
});
|
||||
|
||||
fields.add_field_method_get("username", |_lua, this| {
|
||||
Ok(this.0.details.username.to_string())
|
||||
});
|
||||
|
||||
fields.add_field_method_get("address", |_lua, this| {
|
||||
Ok(this.0.details.address.to_string())
|
||||
});
|
||||
}
|
||||
|
||||
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(_methods: &mut M) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use std::io::Error;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
use std::collections::HashMap;
|
||||
use std::str::FromStr;
|
||||
use std::sync::Arc;
|
||||
|
||||
use futures::future::join_all;
|
||||
|
|
@ -11,14 +10,12 @@ use tokio::sync::mpsc::{channel, Receiver, Sender};
|
|||
use uuid::Uuid;
|
||||
|
||||
use async_trait::async_trait;
|
||||
use mlua::prelude::LuaUserData;
|
||||
use mlua::{Function, MetaMethod, Nil, ToLua, UserDataFields, UserDataMethods};
|
||||
use mlua::Value::UserData;
|
||||
use mlua::{MetaMethod, Nil, ToLua, UserDataFields, UserDataMethods};
|
||||
|
||||
use foundation::prelude::IManager;
|
||||
use foundation::connection::Connection;
|
||||
|
||||
use crate::client::{Client, ClientLua};
|
||||
use crate::client::Client;
|
||||
use crate::messages::ClientMessage;
|
||||
|
||||
#[derive(Debug)]
|
||||
|
|
@ -79,7 +76,7 @@ pub struct ClientManager<Out: 'static>
|
|||
where
|
||||
Out: From<ClientMgrMessage> + Send
|
||||
{
|
||||
clients: Mutex<HashMap<Uuid, Arc<Client<ClientMgrMessage>>>>,
|
||||
pub clients: Mutex<HashMap<Uuid, Arc<Client<ClientMgrMessage>>>>,
|
||||
|
||||
#[allow(dead_code)]
|
||||
server_channel: Mutex<Sender<Out>>,
|
||||
|
|
@ -194,53 +191,6 @@ impl<Out> IManager for ClientManager<Out>
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ClientManagerLua<'lua, Out: 'static>(pub Arc<ClientManager<Out>>, pub Vec<Function<'lua>>)
|
||||
where
|
||||
Out: From<ClientMgrMessage> + Send;
|
||||
|
||||
impl<Out: 'static> LuaUserData for ClientManagerLua<'_, Out>
|
||||
where
|
||||
Out: From<ClientMgrMessage> + Clone + Send
|
||||
{
|
||||
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||
|
||||
}
|
||||
|
||||
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
|
||||
methods.add_async_method("getCount", |_lua,this,()| {
|
||||
let this = this.0.clone();
|
||||
async move {
|
||||
Ok(this.clients.lock().await.len())
|
||||
}
|
||||
});
|
||||
|
||||
methods.add_async_method("getClientList", |_lua,this,()| {
|
||||
let this = this.0.clone();
|
||||
async move {
|
||||
let clients = this.clients.lock().await;
|
||||
let clients: Vec<ClientLua<ClientMgrMessage>> = clients.iter()
|
||||
.map(|(_id,c)| ClientLua(c.clone()))
|
||||
.collect();
|
||||
Ok(clients)
|
||||
}
|
||||
});
|
||||
|
||||
methods.add_async_meta_method(MetaMethod::Index, |lua, this, (index): (String)| {
|
||||
let manager = this.0.clone();
|
||||
async move {
|
||||
if let Ok(id) = Uuid::from_str(&index) {
|
||||
let map = manager.clients.lock().await;
|
||||
if let Some(found) = map.get(&id) {
|
||||
return Ok(ClientLua(found.clone()).to_lua(lua)?);
|
||||
}
|
||||
}
|
||||
return Ok(Nil);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use std::io::Error;
|
||||
|
|
|
|||
|
|
@ -4,5 +4,6 @@ mod client_manager;
|
|||
mod messages;
|
||||
mod network_manager;
|
||||
mod server;
|
||||
mod lua;
|
||||
|
||||
pub use server::Server;
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
use std::sync::Arc;
|
||||
use mlua::prelude::LuaUserData;
|
||||
use mlua::{UserDataFields, UserDataMethods};
|
||||
use crate::client::Client;
|
||||
use crate::messages::ClientMessage;
|
||||
|
||||
pub struct ClientLua<Out: 'static>(pub Arc<Client<Out>>)
|
||||
where
|
||||
Out: From<ClientMessage> + Send;
|
||||
|
||||
impl<Out> ClientLua<Out>
|
||||
where
|
||||
Out: From<ClientMessage> + Send
|
||||
{
|
||||
pub fn new(client: Arc<Client<Out>>) -> Self {
|
||||
ClientLua(client)
|
||||
}
|
||||
}
|
||||
|
||||
impl<Out: 'static> LuaUserData for ClientLua<Out>
|
||||
where
|
||||
Out: From<ClientMessage> + Send
|
||||
{
|
||||
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||
fields.add_field_method_get("uuid", |_lua, this| {
|
||||
Ok(this.0.details.uuid.to_string())
|
||||
});
|
||||
|
||||
fields.add_field_method_get("username", |_lua, this| {
|
||||
Ok(this.0.details.username.to_string())
|
||||
});
|
||||
|
||||
fields.add_field_method_get("address", |_lua, this| {
|
||||
Ok(this.0.details.address.to_string())
|
||||
});
|
||||
}
|
||||
|
||||
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(_methods: &mut M) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
use std::str::FromStr;
|
||||
use std::sync::Arc;
|
||||
use mlua::{Function, MetaMethod, Nil, ToLua, UserDataFields, UserDataMethods};
|
||||
use mlua::prelude::LuaUserData;
|
||||
use uuid::Uuid;
|
||||
use crate::client_manager::{ClientManager, ClientMgrMessage};
|
||||
use crate::lua::ClientLua;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ClientManagerLua<'lua, Out: 'static>(pub Arc<ClientManager<Out>>, pub Vec<Function<'lua>>)
|
||||
where
|
||||
Out: From<ClientMgrMessage> + Send;
|
||||
|
||||
impl<Out: 'static> ClientManagerLua<'_, Out>
|
||||
where
|
||||
Out: From<ClientMgrMessage> + Send
|
||||
{
|
||||
pub fn new(manager: Arc<ClientManager<Out>>) -> Self {
|
||||
ClientManagerLua(manager, Vec::new())
|
||||
}
|
||||
}
|
||||
|
||||
impl<Out: 'static> LuaUserData for ClientManagerLua<'_, Out>
|
||||
where
|
||||
Out: From<ClientMgrMessage> + Clone + Send
|
||||
{
|
||||
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||
|
||||
}
|
||||
|
||||
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
|
||||
methods.add_async_method("getCount", |_lua,this,()| {
|
||||
let this = this.0.clone();
|
||||
async move {
|
||||
Ok(this.clients.lock().await.len())
|
||||
}
|
||||
});
|
||||
|
||||
methods.add_async_method("getClientList", |_lua,this,()| {
|
||||
let this = this.0.clone();
|
||||
async move {
|
||||
let clients = this.clients.lock().await;
|
||||
let clients: Vec<ClientLua<ClientMgrMessage>> = clients.iter()
|
||||
.map(|(_id,c)| ClientLua::new(c.clone()))
|
||||
.collect();
|
||||
Ok(clients)
|
||||
}
|
||||
});
|
||||
|
||||
methods.add_async_meta_method(MetaMethod::Index, |lua, this, (index): (String)| {
|
||||
let manager = this.0.clone();
|
||||
async move {
|
||||
if let Ok(id) = Uuid::from_str(&index) {
|
||||
let map = manager.clients.lock().await;
|
||||
if let Some(found) = map.get(&id) {
|
||||
return Ok(ClientLua::new(found.clone()).to_lua(lua)?);
|
||||
}
|
||||
}
|
||||
return Ok(Nil);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
mod client_lua;
|
||||
mod client_manager_lua;
|
||||
mod server_lua;
|
||||
|
||||
pub use client_lua::ClientLua;
|
||||
pub use client_manager_lua::ClientManagerLua;
|
||||
pub use server_lua::ServerLua;
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
use std::sync::Arc;
|
||||
use mlua::prelude::LuaUserData;
|
||||
use mlua::{UserDataFields, UserDataMethods};
|
||||
use crate::lua::ClientManagerLua;
|
||||
use crate::Server;
|
||||
|
||||
/// # ServerLua
|
||||
/// A wrapper struct for making the Server lua scriptable.
|
||||
///
|
||||
/// # Attributes
|
||||
/// - 1: A reference to the server.
|
||||
#[derive(Clone)]
|
||||
pub struct ServerLua(Arc<Server>);
|
||||
|
||||
impl ServerLua {
|
||||
pub fn new(server: Arc<Server>) -> Self {
|
||||
ServerLua(server)
|
||||
}
|
||||
}
|
||||
|
||||
impl LuaUserData for ServerLua {
|
||||
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||
fields.add_field_method_get("ClientManager", |lua,this| {
|
||||
println!("Getting count");
|
||||
Ok(ClientManagerLua(this.0.client_manager.clone(), vec![]))
|
||||
});
|
||||
fields.add_field_method_get("NetworkManager", |lua,this| {
|
||||
Ok("unimplemented")
|
||||
});
|
||||
fields.add_field_method_get("address", |lua,this| {
|
||||
Ok("unimplemented")
|
||||
});
|
||||
}
|
||||
|
||||
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(_methods: &mut M) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ pub mod client_manager;
|
|||
pub mod messages;
|
||||
pub mod network_manager;
|
||||
pub mod server;
|
||||
mod lua;
|
||||
|
||||
use std::io;
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,8 @@ use tokio::join;
|
|||
use foundation::connection::Connection;
|
||||
use foundation::prelude::IManager;
|
||||
|
||||
use crate::client_manager::{ClientManager, ClientManagerLua, ClientMgrMessage};
|
||||
use crate::client_manager::{ClientManager, ClientMgrMessage};
|
||||
use crate::lua::ServerLua;
|
||||
use crate::network_manager::{NetworkManager, NetworkManagerMessage};
|
||||
|
||||
#[derive(Debug,Clone)]
|
||||
|
|
@ -80,7 +81,7 @@ impl From<ClientMgrMessage> for ServerMessage {
|
|||
/// - lua: The servers lua context, used for running lua scripts.
|
||||
///
|
||||
pub struct Server {
|
||||
client_manager: Arc<ClientManager<ServerMessage>>,
|
||||
pub client_manager: Arc<ClientManager<ServerMessage>>,
|
||||
network_manager: Arc<NetworkManager<ServerMessage>>,
|
||||
receiver: Mutex<Receiver<ServerMessage>>,
|
||||
lua: Arc<Mutex<Lua>>,
|
||||
|
|
@ -101,7 +102,7 @@ impl Server {
|
|||
lua: Arc::new(Mutex::new(Lua::new())),
|
||||
});
|
||||
|
||||
server.lua.lock().await.globals().set("Server", ServerLua(server.clone())).unwrap();
|
||||
server.lua.lock().await.globals().set("Server", ServerLua::new(server.clone())).unwrap();
|
||||
|
||||
server.load_scripts().await?;
|
||||
|
||||
|
|
@ -179,30 +180,3 @@ impl Server {
|
|||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// # ServerLua
|
||||
/// A wrapper struct for making the Server lua scriptable.
|
||||
///
|
||||
/// # Attributes
|
||||
/// - 1: A reference to the server.
|
||||
#[derive(Clone)]
|
||||
struct ServerLua(Arc<Server>);
|
||||
|
||||
impl LuaUserData for ServerLua {
|
||||
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||
fields.add_field_method_get("ClientManager", |lua,this| {
|
||||
println!("Getting count");
|
||||
Ok(ClientManagerLua(this.0.client_manager.clone(), vec![]))
|
||||
});
|
||||
fields.add_field_method_get("NetworkManager", |lua,this| {
|
||||
Ok("unimplemented")
|
||||
});
|
||||
fields.add_field_method_get("address", |lua,this| {
|
||||
Ok("unimplemented")
|
||||
});
|
||||
}
|
||||
|
||||
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(_methods: &mut M) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue