use std::net::SocketAddr;
use std::fmt::Debug;
use serde::{Serialize, de::DeserializeOwned};
use super::read::Reader;
use super::write::Writer;
pub mod error{
use std::fmt::Debug;
#[derive(Debug, thiserror::Error)]
pub enum UpdateError<H: crate::header::IsHeader + Debug> {
#[error("Failed to read from socket!\n{0}")]
Read(std::io::Error),
#[error("Failed to deserialize message from socket!\n{0}")]
ReadUpdate(crate::socket::read::error::UpdateError<H>),
#[error("Failed to write data to socket!\n{0}")]
Write(crate::socket::write::error::WriteError),
}
#[derive(Debug, thiserror::Error)]
pub enum WaitMessageError<H: crate::header::IsHeader + Debug> {
#[error("Failed to update client while waiting for a message!\n{0}")]
Update(#[from] UpdateError<H>),
#[error("Failed to read from socket while waiting for a message!\n{0}")]
Read(#[from] std::io::Error),
}
}
pub mod res {
#[derive(Debug, Clone)]
pub struct UpdateStatus {
new_message: bool,
}
impl UpdateStatus {
pub fn new(new_message: bool) -> Self {
Self { new_message }
}
pub fn new_msg(&self) -> bool {
self.new_message
}
}
}
pub struct _SocketUtils<H, M, O>
where
H: crate::header::IsHeader,
M: Serialize + DeserializeOwned,
O: bincode::Options + Clone,
{
reader: Reader<H, M, O>,
writer: Writer<H, M, O>,
addr: SocketAddr,
}
pub(crate) use _SocketUtils as SocketUtils;
impl<H, M, O> _SocketUtils<H, M, O>
where
H: crate::header::IsHeader + Debug + Clone,
M: Serialize + DeserializeOwned,
O: bincode::Options + Clone,
{
pub(crate) fn new(reader: Reader<H, M, O>, writer: Writer<H, M, O>, addr: SocketAddr) -> Self {
Self {
reader,
writer,
addr,
}
}
pub async fn update_read(&mut self) -> std::io::Result<()> {
self.reader.read().await
}
pub async fn update(&mut self) -> Result<res::UpdateStatus, error::UpdateError<H>> {
let new_message;
match self.reader.update().await {
Ok(nm) => {
new_message = nm;
}
Err(e) => return Err(error::UpdateError::ReadUpdate(e)),
}
match self.writer.write().await {
Ok(_) => {}
Err(e) => return Err(error::UpdateError::Write(e)),
}
Ok(res::UpdateStatus::new(new_message))
}
pub async fn wait_for_message(
&mut self,
) -> Result<crate::msg::MessageWrapper<M, H>, error::WaitMessageError<H>> {
loop {
self.update_read().await?;
if self.update().await?.new_msg() {
if let Some(m) = self.reader.latest_message() {
return Ok(m);
} else {
panic!("This should not happen, and if it does please submit a bug report\nSaying that SocketUtils::update() incorrectly returned that there was a message when there was not");
}
}
}
}
pub fn get_messages(&mut self) -> std::vec::Drain<crate::msg::MessageWrapper<M, H>> {
self.reader.ready_messages()
}
pub fn get_latest_message(&mut self) -> Option<crate::msg::MessageWrapper<M, H>> {
self.reader.latest_message()
}
pub fn queue_message(
&mut self,
message: &crate::msg::MessageWrapper<M, H>,
) -> Result<(), crate::socket::write::error::SeriError> {
self.writer.queue(message)
}
pub fn addr(&self) -> SocketAddr {
self.addr
}
pub fn as_reader(&self) -> &Reader<H, M, O> {
&self.reader
}
pub fn as_writer(&self) -> &Writer<H, M, O> {
&self.writer
}
pub fn as_reader_mut(&mut self) -> &mut Reader<H, M, O> {
&mut self.reader
}
pub fn as_writer_mut(&mut self) -> &mut Writer<H, M, O> {
&mut self.writer
}
pub fn into_rw(self) -> (Reader<H, M, O>, Writer<H, M, O>) {
(self.reader, self.writer)
}
}