use std::any::TypeId;
use bevy::prelude::{App, World};
use serde::de::DeserializeOwned;
use serde::Serialize;
use crate::connection::events::IterMessageEvent;
use crate::inputs::input_buffer::InputMessage;
use crate::packet::message::Message;
use crate::prelude::MapEntities;
use crate::protocol::registry::TypeKind;
use crate::protocol::{BitSerializable, EventContext, Protocol};
use crate::utils::named::Named;
pub trait MessageProtocol:
BitSerializable
+ Serialize
+ DeserializeOwned
+ Clone
+ MapEntities
+ MessageBehaviour
+ Named
+ Send
+ Sync
+ From<InputMessage<<<Self as MessageProtocol>::Protocol as Protocol>::Input>>
+ TryInto<InputMessage<<<Self as MessageProtocol>::Protocol as Protocol>::Input>, Error = ()>
{
type Protocol: Protocol;
fn add_events<Ctx: EventContext>(app: &mut App);
fn push_message_events<E: IterMessageEvent<Self::Protocol, Ctx>, Ctx: EventContext>(
world: &mut World,
events: &mut E,
);
}
#[enum_delegate::register]
pub trait MessageBehaviour {
fn kind(&self) -> MessageKind;
}
impl<M: Message> MessageBehaviour for M {
fn kind(&self) -> MessageKind {
MessageKind::of::<M>()
}
}
#[derive(Debug, Eq, Hash, Copy, Clone, PartialEq)]
pub struct MessageKind(TypeId);
impl MessageKind {
pub fn of<M: Message>() -> Self {
Self(TypeId::of::<M>())
}
}
impl TypeKind for MessageKind {}
impl From<TypeId> for MessageKind {
fn from(type_id: TypeId) -> Self {
Self(type_id)
}
}