moved Lua structs to separate module

This commit is contained in:
michael-bailey 2022-03-03 19:16:53 +00:00
parent 6ebdb441e1
commit 89d673b32f
9 changed files with 158 additions and 110 deletions

View File

@ -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;

View File

@ -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;

View File

@ -4,5 +4,6 @@ mod client_manager;
mod messages;
mod network_manager;
mod server;
mod lua;
pub use server::Server;

View File

@ -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) {
}
}

View File

@ -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);
}
});
}
}

7
server/src/lua/mod.rs Normal file
View File

@ -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;

View File

@ -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) {
}
}

View File

@ -4,6 +4,7 @@ pub mod client_manager;
pub mod messages;
pub mod network_manager;
pub mod server;
mod lua;
use std::io;

View File

@ -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) {
}
}