Update client_manager.rs

+ created function to add/remove clients to the client manager.
This commit is contained in:
michael-bailey 2022-02-28 20:37:45 +00:00
parent cfe72b6c7b
commit 7e920c25c1
1 changed files with 54 additions and 3 deletions

View File

@ -10,9 +10,11 @@ use tokio::sync::mpsc::{channel, Receiver, Sender};
use uuid::Uuid;
use async_trait::async_trait;
use tokio::net::ToSocketAddrs;
use foundation::prelude::IManager;
use foundation::ClientDetails;
use foundation::connection::Connection;
use crate::client::Client;
use crate::messages::ClientMessage;
@ -55,6 +57,30 @@ impl<Out> ClientManager<Out>
self.clients.lock().await.len()
}
pub async fn add_client(
&self,
id: Uuid,
username: String,
address: String,
connection: Arc<Connection>
) {
let client = Client::new(
id,
username,
address,
self.tx.clone(),
connection
);
client.start();
let mut lock = self.clients.lock().await;
lock.insert(client.details.uuid, client);
}
pub async fn remove_client(&self, id: Uuid) {
let mut lock = self.clients.lock().await;
lock.remove(&id);
}
pub async fn handle_channel(&self, message: Option<ClientMgrMessage>) {
use ClientMgrMessage::{Add, Remove, SendClients, BroadcastGlobalMessage, SendError};
println!("Handling channel");
@ -216,10 +242,35 @@ impl<Out> IManager for ClientManager<Out>
#[cfg(test)]
mod test {
use std::io::Error;
use tokio::sync::mpsc::channel;
use uuid::Uuid;
use foundation::messages::client::ClientStreamOut;
use foundation::test::create_connection_pair;
use crate::client_manager::ClientManager;
use crate::messages::ClientMgrMessage;
async fn create_new_client_manager() -> Result<(), Error> {
let client_manager = ClientManager::new()
#[tokio::test]
async fn add_new_client_to_manager() -> Result<(), Error> {
let (sender, mut receiver) =
channel::<ClientMgrMessage>(1024);
let (server, (client, addr)) = create_connection_pair().await?;
let client_manager = ClientManager::new(sender);
let id = Uuid::new_v4();
let username = "TestUser".to_string();
client_manager.add_client(
id,
username.clone(),
addr.to_string(),
server
).await;
assert_eq!(client_manager.get_count().await, 1);
let msg = client.read::<ClientStreamOut>().await?;
assert_eq!(msg, ClientStreamOut::Connected);
Ok(())
}
}