use crate::prelude::*;
use bevy::prelude::*;
use bevy::time::common_conditions::on_timer;
use forky_core::ResultTEExt;
use std::time::Duration;
pub const DEFAULT_TRANSPORT_INTERVAL: Duration = Duration::from_millis(100);
#[extend::ext(name=AppExtTransport)]
pub impl App {
fn add_transport<T: 'static + Transport>(
&mut self,
transport: T,
) -> &mut Self {
self.add_transport_with_duration(transport, DEFAULT_TRANSPORT_INTERVAL)
}
fn add_transport_with_duration<T: 'static + Transport>(
&mut self,
transport: T,
interval: Duration,
) -> &mut Self {
self.insert_non_send_resource(transport).add_systems(
Update,
(
transport_incoming::<T>
.run_if(on_timer(interval))
.before(MessageIncomingSet),
transport_outgoing::<T>
.run_if(on_timer(interval))
.after(MessageOutgoingSet),
),
);
self
}
}
pub(crate) fn transport_incoming<T: Transport>(
mut events: ResMut<MessageIncoming>,
mut transport: NonSendMut<T>,
) {
if let Some(messages) = transport.recv().ok_or(|e| log::error!("foo {e}")) {
for message in messages {
log::info!("<<< MESSAGE: {:?}", message);
events.push(message);
}
}
}
pub(crate) fn transport_outgoing<T: Transport>(
mut outgoing: ResMut<MessageOutgoing>,
mut transport: NonSendMut<T>,
) {
if outgoing.is_empty() {
return;
}
let messages = outgoing.drain(..).collect();
transport.send(&messages).ok_or(|e| log::error!("{e}"));
}