use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ComponentTypeId(pub String);
impl ComponentTypeId {
pub fn of<T: 'static>() -> Self {
ComponentTypeId(std::any::type_name::<T>().to_string())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SceneMessage {
ComponentInsert {
entity_name: String,
component_type: ComponentTypeId,
data: Vec<u8>,
},
EntitySpawn {
entity_name: String,
is_renderable: bool,
is_on_gui: bool,
},
Batch(Vec<SceneMessage>),
FrameBegin {
frame_number: u64,
},
FrameEnd {
frame_number: u64,
},
Ping { timestamp_ms: u64 },
Pong { timestamp_ms: u64 },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageFrame {
pub sequence: u64,
pub message: SceneMessage,
}
impl MessageFrame {
pub fn new(sequence: u64, message: SceneMessage) -> Self {
Self { sequence, message }
}
pub fn to_individual_messages(&self) -> Vec<Self> {
let msg = match &self.message {
SceneMessage::Batch(messages) => messages.clone(),
_ => vec![self.message.clone()],
};
msg.into_iter()
.map(|message| Self {
sequence: self.sequence,
message,
})
.collect()
}
#[allow(clippy::missing_errors_doc)]
pub fn to_bytes(&self) -> Result<Vec<u8>, bincode::error::EncodeError> {
bincode::serde::encode_to_vec(self, bincode::config::standard())
}
#[allow(clippy::missing_errors_doc)]
pub fn from_bytes(bytes: &[u8]) -> Result<Self, bincode::error::DecodeError> {
bincode::serde::decode_from_slice(bytes, bincode::config::standard()).map(|(result, _)| result)
}
}