From fee5fb3c955dd8068bdfbbd14a2a4fe2bf288451 Mon Sep 17 00:00:00 2001 From: Michael Bradley Date: Sat, 25 Oct 2025 21:50:02 -0400 Subject: [PATCH] Replace specific networking trait bounds with general Networked trait --- src/net/distribution.rs | 50 +++++++++++++++++++++++++++++++++-------- src/net/mod.rs | 4 +++- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/net/distribution.rs b/src/net/distribution.rs index 70f2061..9d97287 100644 --- a/src/net/distribution.rs +++ b/src/net/distribution.rs @@ -8,44 +8,76 @@ use super::{ #[derive(Component)] pub struct PeerOwned; -fn spawner> + Component>( +pub trait Networked: Component + NetworkEncodable + NetworkDecodable {} + +impl Networked for T where T: Component + NetworkEncodable + NetworkDecodable {} + +pub trait NetworkEncodable { + fn encode(&self) -> Vec; +} + +impl NetworkEncodable for T +where + T: Clone + Into>, +{ + fn encode(&self) -> Vec { + self.clone().into() + } +} + +pub trait NetworkDecodable: Sized { + type DecodeError; + fn decode(buffer: Vec) -> std::result::Result; +} + +impl NetworkDecodable for T +where + T: TryFrom>, +{ + type DecodeError = T::Error; + fn decode(buffer: Vec) -> std::result::Result { + T::try_from(buffer) + } +} + +fn spawner( mut inbound: MessageReader, mut commands: Commands, ) { for InboundPacket(packet) in inbound.read() { - if let Ok(component) = T::try_from(packet.message.clone()) { + if let Ok(component) = T::decode(packet.message.clone()) { commands.spawn((component, PeerOwned)); } } } -fn new_peer> + Component + Clone>( +fn new_peer( add: On, - peers: Query<&PeerID>, components: Query<&T, Without>, + peers: Query<&PeerID>, mut outbound: MessageWriter, ) -> Result { let peer = peers.get(add.entity)?; for component in components { - outbound.write(Packet::create(component.clone().into(), peer.id)); + outbound.write(Packet::create(component.encode(), peer.id)); } Ok(()) } -fn new_entity> + Component + Clone>( +fn new_entity( add: On, - peers: Query<&PeerID>, components: Query<&T, Without>, + peers: Query<&PeerID>, mut outbound: MessageWriter, ) { if let Ok(component) = components.get(add.entity) { for peer in peers { - outbound.write(Packet::create(component.clone().into(), peer.id)); + outbound.write(Packet::create(component.encode(), peer.id)); } } } -pub fn distribution_plugin> + TryFrom> + Component + Clone>(app: &mut App) { +pub fn distribution_plugin(app: &mut App) { app.add_systems(FixedUpdate, spawner::) .add_observer(new_peer::) .add_observer(new_entity::); diff --git a/src/net/mod.rs b/src/net/mod.rs index 69f2151..1a5834c 100644 --- a/src/net/mod.rs +++ b/src/net/mod.rs @@ -10,7 +10,9 @@ mod thread; #[allow(unused_imports)] pub mod prelude { - pub use super::distribution::distribution_plugin; + pub use super::distribution::{ + NetworkDecodable, NetworkEncodable, Networked, distribution_plugin, + }; pub use super::packet::{InboundPacket, OutboundPacket, Packet}; pub use super::peer::{Peer, PeerID, PeerReceiveTiming, PeerSendTiming, PotentialPeers}; pub use super::plugin::NetIOPlugin;