use std::fmt::Debug;
use std::hash::Hash;
use bevy::prelude::{App, Component, EntityWorldMut, World};
use serde::de::DeserializeOwned;
use serde::Serialize;
use crate::connection::events::{
IterComponentInsertEvent, IterComponentRemoveEvent, IterComponentUpdateEvent,
};
use crate::prelude::MapEntities;
use crate::protocol::{BitSerializable, EventContext, Protocol};
use crate::shared::replication::components::ShouldBeInterpolated;
use crate::shared::replication::components::ShouldBePredicted;
use crate::shared::replication::ReplicationSend;
pub trait ComponentProtocol:
BitSerializable
+ Serialize
+ DeserializeOwned
+ MapEntities
+ ComponentBehaviour
+ Debug
+ Send
+ Sync
+ From<ShouldBePredicted>
+ From<ShouldBeInterpolated>
{
type Protocol: Protocol;
fn add_per_component_replication_send_systems<R: ReplicationSend<Self::Protocol>>(
app: &mut App,
);
fn add_events<Ctx: EventContext>(app: &mut App);
fn push_component_events<
E: IterComponentInsertEvent<Self::Protocol, Ctx>
+ IterComponentRemoveEvent<Self::Protocol, Ctx>
+ IterComponentUpdateEvent<Self::Protocol, Ctx>,
Ctx: EventContext,
>(
world: &mut World,
events: &mut E,
);
fn add_prediction_systems(app: &mut App);
fn add_interpolation_systems(app: &mut App);
}
#[enum_delegate::register]
pub trait ComponentBehaviour {
fn insert(self, entity: &mut EntityWorldMut);
fn update(self, entity: &mut EntityWorldMut);
}
impl<T: Component> ComponentBehaviour for T {
fn insert(self, entity: &mut EntityWorldMut) {
entity.insert(self);
}
fn update(self, entity: &mut EntityWorldMut) {
if let Some(mut c) = entity.get_mut::<T>() {
*c = self;
}
}
}
pub trait ComponentProtocolKind:
BitSerializable
+ Serialize
+ DeserializeOwned
+ MapEntities
+ PartialEq
+ Eq
+ Hash
+ Debug
+ Send
+ Sync
+ for<'a> From<&'a <Self::Protocol as Protocol>::Components>
+ ComponentKindBehaviour
{
type Protocol: Protocol;
}
pub trait ComponentKindBehaviour {
fn remove(self, entity: &mut EntityWorldMut);
}
pub trait IntoKind<K: ComponentProtocolKind> {
fn into_kind() -> K;
}