use bevy_ecs::prelude::Entity;
use std::sync::Arc;
use crate::{BufferAccessLifecycle, BufferKey, ChannelSender};
pub struct BufferKeyBuilder {
scope: Entity,
session: Entity,
accessor: Entity,
lifecycle: Option<(ChannelSender, Arc<()>)>,
}
impl BufferKeyBuilder {
pub(crate) fn build<T>(&self, buffer: Entity) -> BufferKey<T> {
BufferKey {
buffer,
session: self.session,
accessor: self.accessor,
lifecycle: self.lifecycle.as_ref().map(|(sender, tracker)| {
Arc::new(BufferAccessLifecycle::new(
self.scope,
buffer,
self.session,
self.accessor,
sender.clone(),
tracker.clone(),
))
}),
_ignore: Default::default(),
}
}
pub(crate) fn with_tracking(
scope: Entity,
session: Entity,
accessor: Entity,
sender: ChannelSender,
tracker: Arc<()>,
) -> Self {
Self {
scope,
session,
accessor,
lifecycle: Some((sender, tracker)),
}
}
pub(crate) fn without_tracking(scope: Entity, session: Entity, accessor: Entity) -> Self {
Self {
scope,
session,
accessor,
lifecycle: None,
}
}
}