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