#![doc = include_str!("../README.md")]
#![warn(missing_docs)]
#![allow(clippy::too_many_arguments)]
#![allow(clippy::type_complexity)]
pub mod prelude {
pub use super::PostcardResult;
pub use crate::{deserialize, serialize, NetworkedComponent, NetworkedWrapper};
pub use bevy_bundlication_macros::NetworkedBundle;
pub use bevy_replicon::core::replication::replication_registry::ctx::{
SerializeCtx, WriteCtx as DeserializeCtx,
};
pub use postcard::Error as PostcardError;
}
pub mod macro_export {
pub use crate::{deserialize, serialize, NetworkedComponent, NetworkedWrapper};
pub use bevy::ecs::world::World;
pub use bevy_replicon::bytes::Bytes;
pub use bevy_replicon::core::replication::{
replication_registry::{
ctx::{SerializeCtx, WriteCtx as DeserializeCtx},
rule_fns::{DeserializeFn, RuleFns},
ReplicationRegistry,
},
replication_rules::{GroupReplication, ReplicationRule},
};
pub use postcard;
}
use std::io::{Read, Write};
use bevy::prelude::*;
use prelude::{DeserializeCtx, SerializeCtx};
use serde::{Deserialize, Serialize};
pub type PostcardResult<T> = postcard::Result<T>;
pub fn deserialize<R, T>(r: R) -> PostcardResult<T>
where
R: Read,
T: serde::de::DeserializeOwned,
{
postcard::from_io((r, &mut [0; 1500])).map(|(t, _)| t)
}
pub fn serialize<T, W>(w: W, t: &T) -> PostcardResult<()>
where
W: Write,
T: Serialize + ?Sized,
{
postcard::to_io(t, w).map(|_| ())
}
pub trait NetworkedComponent: Sized {
fn write_data(&self, w: impl Write, ctx: &SerializeCtx) -> PostcardResult<()>;
fn read_new(r: impl Read, ctx: &mut DeserializeCtx) -> PostcardResult<Self>;
fn read_in_place(&mut self, r: impl Read, ctx: &mut DeserializeCtx) -> PostcardResult<()> {
*self = Self::read_new(r, ctx)?;
Ok(())
}
}
impl<T: Component + Serialize + for<'a> Deserialize<'a>> NetworkedComponent for T {
fn write_data(&self, w: impl Write, _: &SerializeCtx) -> PostcardResult<()> {
serialize(w, self).unwrap();
Ok(())
}
fn read_new(r: impl Read, _: &mut DeserializeCtx) -> PostcardResult<Self> {
deserialize(r)
}
}
pub trait NetworkedWrapper<From: Component> {
fn write_data(from: &From, w: impl Write, ctx: &SerializeCtx) -> PostcardResult<()>;
fn read_new(r: impl Read, ctx: &mut DeserializeCtx) -> PostcardResult<From>;
fn read_in_place(
from: &mut From,
r: impl Read,
ctx: &mut DeserializeCtx,
) -> PostcardResult<()> {
*from = Self::read_new(r, ctx)?;
Ok(())
}
}