use bevy::{prelude::*, ptr::Ptr};
use bytes::Bytes;
use super::ctx::{RemoveCtx, SerializeCtx, WriteCtx};
use crate::shared::replication::{
deferred_entity::DeferredEntity,
receive_markers::{EntityMarkers, ReceiveMarkers},
registry::{component_fns::ComponentFns, rule_fns::UntypedRuleFns},
};
pub(crate) struct SerdeFns<'a> {
component_fns: &'a ComponentFns,
rule_fns: &'a UntypedRuleFns,
}
impl<'a> SerdeFns<'a> {
pub(super) unsafe fn new(
component_fns: &'a ComponentFns,
rule_fns: &'a UntypedRuleFns,
) -> Self {
Self {
component_fns,
rule_fns,
}
}
pub(crate) unsafe fn serialize(
&self,
ctx: &SerializeCtx,
ptr: Ptr,
message: &mut Vec<u8>,
) -> Result<()> {
unsafe {
self.component_fns
.serialize(ctx, self.rule_fns, ptr, message)
}
}
pub(crate) fn write(
&self,
ctx: &mut WriteCtx,
entity_markers: &EntityMarkers,
entity: &mut DeferredEntity,
message: &mut Bytes,
) -> Result<()> {
unsafe {
self.component_fns
.write(ctx, self.rule_fns, entity_markers, entity, message)
}
}
pub(crate) fn consume_or_write(
&self,
ctx: &mut WriteCtx,
entity_markers: &EntityMarkers,
receive_markers: &ReceiveMarkers,
entity: &mut DeferredEntity,
message: &mut Bytes,
) -> Result<()> {
unsafe {
self.component_fns.consume_or_write(
ctx,
self.rule_fns,
entity_markers,
receive_markers,
entity,
message,
)
}
}
pub(crate) fn remove(
&self,
ctx: &mut RemoveCtx,
entity_markers: &EntityMarkers,
entity: &mut DeferredEntity,
) {
self.component_fns.remove(ctx, entity_markers, entity);
}
}