zero-trust-rps 0.1.1

Online Multiplayer Rock Paper Scissors
Documentation
use std::{future::Future, time::Duration};

use serde::de::DeserializeOwned;
use tokio::sync::mpsc::{Receiver, UnboundedReceiver};

use crate::common::connection::{quic::QuicReader, Reader};

pub trait AsyncChannelReceiver<T: Send>: Send {
    fn receive(&mut self) -> impl Future<Output = Option<T>> + Send;
}

impl<TFrom: Send, TTo: From<TFrom> + Send> AsyncChannelReceiver<TTo> for UnboundedReceiver<TFrom> {
    async fn receive(&mut self) -> Option<TTo> {
        self.recv().await.map(Into::into)
    }
}

impl<TFrom: Send, TTo: From<TFrom> + Send> AsyncChannelReceiver<TTo> for Receiver<TFrom> {
    async fn receive(&mut self) -> Option<TTo> {
        self.recv().await.map(Into::into)
    }
}

impl<T: Send> AsyncChannelReceiver<T> for () {
    async fn receive(&mut self) -> Option<T> {
        tokio::time::sleep(Duration::MAX).await;
        None
    }
}

impl<T: Send + DeserializeOwned> AsyncChannelReceiver<T> for QuicReader {
    async fn receive(&mut self) -> Option<T> {
        self.get_next_message::<T>().await.unwrap_or_else(|err| {
            log::error!("Could not receive message: {err}");
            None
        })
    }
}