From 89d673b32f652beff79f810d2dc166bd3bab09d7 Mon Sep 17 00:00:00 2001 From: michael-bailey Date: Thu, 3 Mar 2022 19:16:53 +0000 Subject: [PATCH] moved Lua structs to separate module --- server/src/client.rs | 27 ------------ server/src/client_manager.rs | 56 ++----------------------- server/src/lib.rs | 1 + server/src/lua/client_lua.rs | 41 ++++++++++++++++++ server/src/lua/client_manager_lua.rs | 63 ++++++++++++++++++++++++++++ server/src/lua/mod.rs | 7 ++++ server/src/lua/server_lua.rs | 38 +++++++++++++++++ server/src/main.rs | 1 + server/src/server.rs | 34 ++------------- 9 files changed, 158 insertions(+), 110 deletions(-) create mode 100644 server/src/lua/client_lua.rs create mode 100644 server/src/lua/client_manager_lua.rs create mode 100644 server/src/lua/mod.rs create mode 100644 server/src/lua/server_lua.rs diff --git a/server/src/client.rs b/server/src/client.rs index 079f37e..25699e9 100644 --- a/server/src/client.rs +++ b/server/src/client.rs @@ -195,33 +195,6 @@ impl Ord for Client } } -pub struct ClientLua(pub Arc>) - where - Out: From + Send; - -impl LuaUserData for ClientLua - where - Out: From + 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; diff --git a/server/src/client_manager.rs b/server/src/client_manager.rs index b3dea2c..12d0461 100644 --- a/server/src/client_manager.rs +++ b/server/src/client_manager.rs @@ -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 where Out: From + Send { - clients: Mutex>>>, + pub clients: Mutex>>>, #[allow(dead_code)] server_channel: Mutex>, @@ -194,53 +191,6 @@ impl IManager for ClientManager } } -#[derive(Clone)] -pub struct ClientManagerLua<'lua, Out: 'static>(pub Arc>, pub Vec>) - where - Out: From + Send; - -impl LuaUserData for ClientManagerLua<'_, Out> - where - Out: From + 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> = 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; diff --git a/server/src/lib.rs b/server/src/lib.rs index 2e86955..450f74b 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -4,5 +4,6 @@ mod client_manager; mod messages; mod network_manager; mod server; +mod lua; pub use server::Server; \ No newline at end of file diff --git a/server/src/lua/client_lua.rs b/server/src/lua/client_lua.rs new file mode 100644 index 0000000..bb8523e --- /dev/null +++ b/server/src/lua/client_lua.rs @@ -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(pub Arc>) + where + Out: From + Send; + +impl ClientLua + where + Out: From + Send +{ + pub fn new(client: Arc>) -> Self { + ClientLua(client) + } +} + +impl LuaUserData for ClientLua + where + Out: From + 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) { + + } +} \ No newline at end of file diff --git a/server/src/lua/client_manager_lua.rs b/server/src/lua/client_manager_lua.rs new file mode 100644 index 0000000..bb2fa35 --- /dev/null +++ b/server/src/lua/client_manager_lua.rs @@ -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>, pub Vec>) + where + Out: From + Send; + +impl ClientManagerLua<'_, Out> + where + Out: From + Send +{ + pub fn new(manager: Arc>) -> Self { + ClientManagerLua(manager, Vec::new()) + } +} + +impl LuaUserData for ClientManagerLua<'_, Out> + where + Out: From + 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> = 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); + } + }); + } +} \ No newline at end of file diff --git a/server/src/lua/mod.rs b/server/src/lua/mod.rs new file mode 100644 index 0000000..56d5028 --- /dev/null +++ b/server/src/lua/mod.rs @@ -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; \ No newline at end of file diff --git a/server/src/lua/server_lua.rs b/server/src/lua/server_lua.rs new file mode 100644 index 0000000..c1267de --- /dev/null +++ b/server/src/lua/server_lua.rs @@ -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); + +impl ServerLua { + pub fn new(server: Arc) -> 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) { + + } +} \ No newline at end of file diff --git a/server/src/main.rs b/server/src/main.rs index 34dbc27..90a7537 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -4,6 +4,7 @@ pub mod client_manager; pub mod messages; pub mod network_manager; pub mod server; +mod lua; use std::io; diff --git a/server/src/server.rs b/server/src/server.rs index 55b05bc..fb1c3cd 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -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 for ServerMessage { /// - lua: The servers lua context, used for running lua scripts. /// pub struct Server { - client_manager: Arc>, + pub client_manager: Arc>, network_manager: Arc>, receiver: Mutex>, lua: Arc>, @@ -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); - -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) { - - } -}