added port configurability

~ moved components to seperate modules
~ added builder and config to network manager
This commit is contained in:
michael-bailey 2022-06-22 23:38:44 +02:00
parent 715f6c1c4c
commit 808c330a3e
13 changed files with 108 additions and 52 deletions

View File

@ -26,7 +26,7 @@ async fn main() {
.short('p')
.long("port")
.takes_value(true)
.value_parser(value_parser!(usize))
.value_parser(value_parser!(u16))
.default_value("5600")
.help("overrides the default port")
)
@ -51,7 +51,7 @@ async fn main() {
let mut server_builder = Server::create();
if let Some(port) = args.get_one::<usize>("port") {
if let Some(port) = args.get_one::<u16>("port") {
server_builder = server_builder.port(*port);
println!("got port number {:?}", port);
}

View File

@ -37,6 +37,6 @@ pub(crate) use connection_initiator::{ConnectionInitiator, InitiatorOutput};
use listener::{ListenerMessage, ListenerOutput, NetworkListener};
pub(crate) use network_manager::{
NetworkManager,
NetworkMessage,
NetworkOutput,
NetworkMessage
};

View File

@ -0,0 +1,26 @@
use actix::{Actor, Addr, WeakRecipient};
use crate::network::network_manager::messages::NetworkOutput;
use crate::network::NetworkManager;
pub struct Builder {
pub(super) port: Option<u16>,
pub(super) delegate: WeakRecipient<NetworkOutput>,
}
impl Builder {
pub(super) fn new(delegate: WeakRecipient<NetworkOutput>) -> Self {
Self {
port: None,
delegate,
}
}
pub fn port(mut self, port: u16) -> Self {
self.port = Some(port);
self
}
pub fn build(self) -> Addr<NetworkManager> {
NetworkManager::from(self).start()
}
}

View File

@ -0,0 +1,5 @@
#[derive(Debug)]
pub(super) struct Config {
pub(super) port: u16,
}

View File

@ -0,0 +1,18 @@
use actix::Addr;
use foundation::ClientDetails;
use crate::network::Connection;
use actix::Message;
#[derive(Message, Debug, Ord, PartialOrd, Eq, PartialEq)]
#[rtype(result = "()")]
pub enum NetworkMessage {
StartListening,
StopListening,
}
#[derive(Message)]
#[rtype(result = "()")]
pub enum NetworkOutput {
NewClient(Addr<Connection>, ClientDetails),
InfoRequested(Addr<Connection>),
}

View File

@ -0,0 +1,13 @@
//! # network_manager
//! This module contains the network manager actor
//! it's role involves handling new oncomming network connections
mod builder;
mod messages;
mod network_manager;
mod config;
use config::*;
pub(crate) use network_manager::{NetworkManager};
pub(crate) use builder::*;
pub(crate) use messages::{NetworkMessage,NetworkOutput};

View File

@ -1,43 +1,14 @@
//! # network_manager
//! This module contains the network manager actor
//! it's role involves handling new oncomming network connections
use actix::{
Actor,
Addr,
AsyncContext,
Context,
Handler,
Message,
WeakRecipient,
};
use actix::{Actor, Addr, AsyncContext, Context, Handler, WeakRecipient};
use foundation::ClientDetails;
use crate::network::{
listener::ListenerOutput,
Connection,
ConnectionInitiator,
InitiatorOutput,
InitiatorOutput::ClientRequest,
ListenerMessage,
NetworkListener,
};
#[derive(Message, Debug, Ord, PartialOrd, Eq, PartialEq)]
#[rtype(result = "()")]
pub enum NetworkMessage {
StartListening,
StopListening,
}
#[derive(Message)]
#[rtype(result = "()")]
pub enum NetworkOutput {
NewClient(Addr<Connection>, ClientDetails),
InfoRequested(Addr<Connection>),
}
use crate::network::{Connection, ConnectionInitiator, InitiatorOutput};
use crate::network::listener::{ListenerMessage, ListenerOutput};
use crate::network::listener::NetworkListener;
use crate::network::network_manager::Builder;
use crate::network::network_manager::config::Config;
use crate::network::network_manager::messages::{NetworkMessage, NetworkOutput};
pub struct NetworkManager {
config: Config,
listener_addr: Option<Addr<NetworkListener>>,
delegate: WeakRecipient<NetworkOutput>,
initiators: Vec<Addr<ConnectionInitiator>>,
@ -46,11 +17,18 @@ pub struct NetworkManager {
impl NetworkManager {
pub fn new(delegate: WeakRecipient<NetworkOutput>) -> Addr<NetworkManager> {
NetworkManager {
config: Config {
port: 5600
},
listener_addr: None,
delegate,
initiators: Vec::new(),
}
.start()
.start()
}
pub fn create(delegate: WeakRecipient<NetworkOutput>) -> Builder {
Builder::new(delegate)
}
fn start_listener(&mut self, _ctx: &mut <Self as actix::Actor>::Context) {
@ -135,10 +113,10 @@ impl Actor for NetworkManager {
type Context = Context<Self>;
fn started(&mut self, ctx: &mut Self::Context) {
println!("started network manager");
println!("[NetworkManager] started with config {:?}", self.config);
let recipient = ctx.address().recipient();
self.listener_addr
.replace(NetworkListener::new("0.0.0.0:5600", recipient));
.replace(NetworkListener::new(format!("0.0.0.0:{}", self.config.port), recipient));
}
}
@ -187,3 +165,17 @@ impl Handler<InitiatorOutput> for NetworkManager {
}
}
}
impl From<Builder> for NetworkManager {
fn from(builder: Builder) -> Self {
Self {
config: Config {
port: builder.port.unwrap_or_else(|| 5600),
},
listener_addr: None,
delegate: builder.delegate,
initiators: Vec::default()
}
}
}

View File

@ -3,7 +3,7 @@ use super::*;
pub struct ServerBuilder {
pub(super) name: Option<String>,
pub(super) port: Option<usize>,
pub(super) port: Option<u16>,
pub(super) owner: Option<String>,
}
@ -16,7 +16,7 @@ impl ServerBuilder {
}
}
pub fn port(mut self, port: usize) -> Self {
pub fn port(mut self, port: u16) -> Self {
self.port = Some(port);
self
}

View File

@ -1,6 +1,6 @@
/// Configuration for the server
pub(super) struct ServerConfig {
pub(super) port: usize,
pub(super) port: u16,
pub(super) name: String,
pub(super) owner: String,
}

View File

@ -52,8 +52,8 @@ impl Server {
let fut = wrap_future(
sender.send(SendData(
serde_json::to_string(&GotInfo {
server_name: "String".to_owned(),
server_owner: "String".to_owned(),
server_name: self.config.name.clone(),
server_owner: self.config.owner.clone(),
})
.expect("Failed to serialise"),
)),
@ -70,13 +70,15 @@ impl Actor for Server {
type Context = Context<Self>;
fn started(&mut self, ctx: &mut Self::Context) {
let addr = ctx.address();
let addr = ctx.address().downgrade();
self.network_manager
.replace(NetworkManager::new(addr.clone().recipient().downgrade()));
let nm = NetworkManager::create(addr.clone().recipient())
.port(self.config.port)
.build();
self.network_manager.replace(nm);
self.client_management.replace(ClientManager::new(
addr.clone().recipient::<ClientManagerOutput>().downgrade(),
addr.clone().recipient(),
));
if let Some(net_mgr) = self.network_manager.as_ref() {