Created sender objects

+ added StreamMessageSender trait
+ added SocketSender struct
+ added StreamMessageSender implementation
+added new function
+ added new network module to main
This commit is contained in:
michael-bailey 2021-08-04 23:46:26 +01:00
parent bee9617206
commit fb43ad45fc
3 changed files with 69 additions and 4 deletions

View File

@ -2,8 +2,10 @@ pub mod client;
pub mod client_manager;
pub mod messages;
pub mod network_manager;
pub mod network;
pub mod server;
pub mod encryption;
pub mod prelude;
use std::io;

View File

@ -0,0 +1,62 @@
use std::sync::Arc;
use std::io::Write;
use std::io::Error;
use async_trait::async_trait;
use serde::Serialize;
use serde::de::DeserializeOwned;
use tokio::io::split;
use tokio::sync::Mutex;
use tokio::io::ReadHalf;
use tokio::io::BufReader;
use tokio::io::WriteHalf;
use tokio::net::TcpStream;
use tokio::io::AsyncWriteExt;
use tokio::io::AsyncBufReadExt;
use crate::prelude::StreamMessageSender;
#[derive(Debug)]
pub struct SocketSender {
stream_tx: Mutex<WriteHalf<tokio::net::TcpStream>>,
stream_rx: Mutex<BufReader<ReadHalf<tokio::net::TcpStream>>>,
}
impl SocketSender {
pub fn new(connection: TcpStream) -> Arc<Self> {
let (rd, wd) = split(connection);
let reader = BufReader::new(rd);
Arc::new(SocketSender {
stream_tx: Mutex::new(wd),
stream_rx: Mutex::new(reader),
})
}
}
#[async_trait]
impl StreamMessageSender for SocketSender {
async fn send<TOutMessage: Serialize + Send>
(self: &Arc<Self>, message: TOutMessage) -> Result<(), Error>
{
let mut out_buffer: Vec<u8> = Vec::new();
let message_string = serde_json::to_string(&message)?;
writeln!(out_buffer, "{}", message_string)?;
let mut lock = self.stream_tx.lock().await;
lock.write_all(&out_buffer).await?;
lock.flush().await?;
Ok(())
}
async fn recv<'de, TInMessage: DeserializeOwned + Send>
(self: &Arc<Self>) -> Result<TInMessage, Error>
{
let mut in_buffer = String::new();
let mut lock = self.stream_rx.lock().await;
lock.read_line(&mut in_buffer).await?;
let message: TInMessage = serde_json::from_str(&in_buffer)
.expect("[StreamMessageSender:recv] deserialisation failed");
Ok(message)
}
}

View File

@ -2,11 +2,12 @@ use std::sync::Arc;
use async_trait::async_trait;
use serde::{Serialize,Deserialize};
use serde::Serialize;
use serde::de::DeserializeOwned;
#[async_trait]
trait Sender<'de, TMessage: Deserialize<'de> + Serialize> {
async fn send(self: &Arc<Self>, message: TMessage) -> Result<(), std::io::Error>;
async fn recv(self: &Arc<Self>) -> Result<TMessage, std::io::Error>;
pub trait StreamMessageSender {
async fn send<TOutMessage: Serialize + Send>(self: &Arc<Self>, message: TOutMessage) -> Result<(), std::io::Error>;
async fn recv<'de, TInMessage: DeserializeOwned + Send>(self: &Arc<Self>) -> Result<TInMessage, std::io::Error>;
}