diff --git a/src/net.rs b/src/net.rs index 71a48a5..d1ab850 100644 --- a/src/net.rs +++ b/src/net.rs @@ -4,7 +4,7 @@ use std::{ }; use bevy::{prelude::*, tasks::futures_lite::io}; -use crossbeam_channel::{Receiver, Sender, unbounded}; +use crossbeam_channel::{Receiver, Sender, TrySendError, unbounded}; use crate::game::seed::Seed; @@ -68,8 +68,35 @@ fn setup_socket(port: u16) -> Result<(Sender, Receiver); -#[derive(Resource)] -pub struct NetworkReceive(Receiver); +impl NetworkSend { + /// Send the message, erroring if the queue is full or disconnected + pub fn send( + &self, + value: Vec, + address: SocketAddr, + ) -> Result<(), TrySendError> { + self.0.try_send((value, address)) + } +} + +#[derive(Resource, Clone)] +struct NetworkReceive(Receiver); + +impl NetworkReceive { + fn iter(&self) -> Iter { + Iter(self.0.clone()) + } +} + +struct Iter(Receiver); + +impl Iterator for Iter { + type Item = NetworkMessage; + + fn next(&mut self) -> Option { + self.0.try_recv().ok() + } +} fn handle_network_io( receive: Res, @@ -77,14 +104,14 @@ fn handle_network_io( seed: Option>, mut commands: Commands, ) -> Result { - let Ok((message, address)) = receive.0.try_recv() else { - return Ok(()); - }; - if let Some(value) = seed { - send.0.try_send(((*value).into(), address))?; - } else { - commands.insert_resource::(message.try_into()?); + for (message, address) in receive.iter() { + if let Some(ref value) = seed { + send.send((**value).into(), address)?; + } else { + commands.insert_resource::(message.try_into()?); + } } + Ok(()) }