Skip to content

Commit b21c218

Browse files
committed
Fleshing out implementation of JsonBuffer
Signed-off-by: Michael X. Grey <[email protected]>
1 parent 8f79d53 commit b21c218

File tree

3 files changed

+331
-51
lines changed

3 files changed

+331
-51
lines changed

src/buffer.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ use bevy_ecs::{
2424

2525
use std::{ops::RangeBounds, sync::Arc};
2626

27+
use thiserror::Error as ThisError;
28+
2729
use crate::{
2830
Builder, Chain, Gate, GateState, InputSlot, NotifyBufferUpdate, OnNewBufferValue, UnusedTarget,
2931
};
@@ -571,6 +573,12 @@ where
571573
}
572574
}
573575

576+
#[derive(ThisError, Debug, Clone)]
577+
pub enum BufferError {
578+
#[error("The key was unable to identify a buffer")]
579+
BufferMissing,
580+
}
581+
574582
#[cfg(test)]
575583
mod tests {
576584
use crate::{prelude::*, testing::*, Gate};

src/buffer/any_buffer.rs

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use bevy_ecs::{
3030
use thiserror::Error as ThisError;
3131

3232
use crate::{
33-
Buffer, BufferAccessLifecycle, BufferAccessMut, BufferKey, BufferStorage,
33+
Buffer, BufferAccessLifecycle, BufferAccessMut, BufferError, BufferKey, BufferStorage,
3434
DrainBuffer, NotifyBufferUpdate, GateState, Gate, OperationResult, OperationError,
3535
InspectBuffer, ManageBuffer,
3636
};
@@ -80,8 +80,8 @@ impl<T: 'static + Send + Sync + Any> From<Buffer<T>> for AnyBuffer {
8080
}
8181
}
8282

83-
/// Similar to a [`BufferKey`][crate::BufferKey] except it can be used for any
84-
/// buffer without knowing the buffer's type ahead of time.
83+
/// Similar to a [`BufferKey`] except it can be used for any buffer without
84+
/// knowing the buffer's message type at compile time.
8585
///
8686
/// Use this with [`AnyBufferAccess`] to directly view or manipulate the contents
8787
/// of a buffer.
@@ -97,7 +97,7 @@ pub struct AnyBufferKey {
9797
impl std::fmt::Debug for AnyBufferKey {
9898
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9999
f
100-
.debug_struct("DynBufferKey")
100+
.debug_struct("AnyBufferKey")
101101
.field("buffer", &self.buffer)
102102
.field("session", &self.session)
103103
.field("accessor", &self.accessor)
@@ -216,7 +216,7 @@ impl<'w, 's, 'a> AnyBufferMut<'w, 's, 'a> {
216216
pub fn drain<R: RangeBounds<usize>>(&mut self, range: R) -> DrainAnyBuffer<'_> {
217217
self.modified = true;
218218
DrainAnyBuffer {
219-
inner: self.storage.any_drain(self.session, AnyRange::new(range))
219+
interface: self.storage.any_drain(self.session, AnyRange::new(range))
220220
}
221221
}
222222

@@ -349,31 +349,25 @@ impl<'w, 's, 'a> Drop for AnyBufferMut<'w, 's, 'a> {
349349
}
350350
}
351351

352-
#[derive(ThisError, Debug, Clone)]
353-
pub enum AnyBufferError {
354-
#[error("The key was unable to identify a buffer")]
355-
BufferMissing,
356-
}
357-
358352
/// This trait allows [`World`] to give you access to any buffer using an
359353
/// [`AnyBufferKey`].
360354
pub trait AnyBufferWorldAccess {
361355
fn any_buffer_mut<U>(
362356
&mut self,
363357
key: &AnyBufferKey,
364358
f: impl FnOnce(AnyBufferMut) -> U,
365-
) -> Result<U, AnyBufferError>;
359+
) -> Result<U, BufferError>;
366360
}
367361

368362
impl AnyBufferWorldAccess for World {
369363
fn any_buffer_mut<U>(
370364
&mut self,
371365
key: &AnyBufferKey,
372366
f: impl FnOnce(AnyBufferMut) -> U,
373-
) -> Result<U, AnyBufferError> {
367+
) -> Result<U, BufferError> {
374368
let interface = key.interface;
375369
let mut state = interface.create_any_buffer_access_mut_state(self);
376-
let mut access = state.get_buffer_access_mut(self);
370+
let mut access = state.get_any_buffer_access_mut(self);
377371
let buffer_mut = access.as_any_buffer_mut(key)?;
378372
Ok(f(buffer_mut))
379373
}
@@ -395,10 +389,10 @@ trait AnyBufferManagement: AnyBufferViewing {
395389
fn any_oldest_mut<'a>(&'a mut self, session: Entity) -> Option<AnyMessageMut<'a>>;
396390
fn any_newest_mut<'a>(&'a mut self, session: Entity) -> Option<AnyMessageMut<'a>>;
397391
fn any_get_mut<'a>(&'a mut self, session: Entity, index: usize) -> Option<AnyMessageMut<'a>>;
398-
fn any_drain<'a>(&'a mut self, session: Entity, range: AnyRange) -> Box<dyn DrainAnyBufferImpl + 'a>;
392+
fn any_drain<'a>(&'a mut self, session: Entity, range: AnyRange) -> Box<dyn DrainAnyBufferInterface + 'a>;
399393
}
400394

401-
struct AnyRange {
395+
pub(crate) struct AnyRange {
402396
start_bound: std::ops::Bound<usize>,
403397
end_bound: std::ops::Bound<usize>,
404398
}
@@ -492,19 +486,21 @@ pub type AnyMessage = Box<dyn Any + 'static + Send + Sync>;
492486
pub struct AnyMessageError {
493487
/// The original value provided
494488
pub value: AnyMessage,
495-
/// The type expected by the buffer
489+
/// The ID of the type expected by the buffer
496490
pub type_id: TypeId,
491+
/// The name of the type expected by the buffer
492+
pub type_name: &'static str,
497493
}
498494

499495
pub type AnyMessagePushResult = Result<Option<AnyMessage>, AnyMessageError>;
500496

501497
impl<T: 'static + Send + Sync + Any> AnyBufferManagement for Mut<'_, BufferStorage<T>> {
502-
fn any_push(&mut self, session: Entity, value: AnyMessage) -> Result<Option<AnyMessage>, AnyMessageError> {
498+
fn any_push(&mut self, session: Entity, value: AnyMessage) -> AnyMessagePushResult {
503499
let value = from_any_message::<T>(value)?;
504500
Ok(self.push(session, value).map(to_any_message))
505501
}
506502

507-
fn any_push_as_oldest(&mut self, session: Entity, value: AnyMessage) -> Result<Option<AnyMessage>, AnyMessageError> {
503+
fn any_push_as_oldest(&mut self, session: Entity, value: AnyMessage) -> AnyMessagePushResult {
508504
let value = from_any_message::<T>(value)?;
509505
Ok(self.push_as_oldest(session, value).map(to_any_message))
510506
}
@@ -529,7 +525,7 @@ impl<T: 'static + Send + Sync + Any> AnyBufferManagement for Mut<'_, BufferStora
529525
self.get_mut(session, index).map(to_any_mut)
530526
}
531527

532-
fn any_drain<'a>(&'a mut self, session: Entity, range: AnyRange) -> Box<dyn DrainAnyBufferImpl + 'a> {
528+
fn any_drain<'a>(&'a mut self, session: Entity, range: AnyRange) -> Box<dyn DrainAnyBufferInterface + 'a> {
533529
Box::new(self.drain(session, range))
534530
}
535531
}
@@ -554,30 +550,31 @@ where
554550
AnyMessageError {
555551
value,
556552
type_id: TypeId::of::<T>(),
553+
type_name: std::any::type_name::<T>(),
557554
}
558555
})?;
559556

560557
Ok(*value)
561558
}
562559

563560
pub(crate) trait AnyBufferAccessMutState {
564-
fn get_buffer_access_mut<'s, 'w: 's>(&'s mut self, world: &'w mut World) -> Box<dyn AnyBufferAccessMut<'w, 's> + 's>;
561+
fn get_any_buffer_access_mut<'s, 'w: 's>(&'s mut self, world: &'w mut World) -> Box<dyn AnyBufferAccessMut<'w, 's> + 's>;
565562
}
566563

567564
impl<T: 'static + Send + Sync + Any> AnyBufferAccessMutState for SystemState<BufferAccessMut<'static, 'static, T>> {
568-
fn get_buffer_access_mut<'s, 'w: 's>(&'s mut self, world: &'w mut World) -> Box<dyn AnyBufferAccessMut<'w, 's> + 's> {
565+
fn get_any_buffer_access_mut<'s, 'w: 's>(&'s mut self, world: &'w mut World) -> Box<dyn AnyBufferAccessMut<'w, 's> + 's> {
569566
Box::new(self.get_mut(world))
570567
}
571568
}
572569

573-
pub(crate) trait AnyBufferAccessMut<'w, 's> {
574-
fn as_any_buffer_mut<'a>(&'a mut self, key: &AnyBufferKey) -> Result<AnyBufferMut<'w, 's, 'a>, AnyBufferError>;
570+
trait AnyBufferAccessMut<'w, 's> {
571+
fn as_any_buffer_mut<'a>(&'a mut self, key: &AnyBufferKey) -> Result<AnyBufferMut<'w, 's, 'a>, BufferError>;
575572
}
576573

577574
impl<'w, 's, T: 'static + Send + Sync + Any> AnyBufferAccessMut<'w, 's> for BufferAccessMut<'w, 's, T> {
578-
fn as_any_buffer_mut<'a>(&'a mut self, key: &AnyBufferKey) -> Result<AnyBufferMut<'w, 's, 'a>, AnyBufferError> {
575+
fn as_any_buffer_mut<'a>(&'a mut self, key: &AnyBufferKey) -> Result<AnyBufferMut<'w, 's, 'a>, BufferError> {
579576
let BufferAccessMut { query, commands } = self;
580-
let (storage, gate) = query.get_mut(key.buffer).map_err(|_| AnyBufferError::BufferMissing)?;
577+
let (storage, gate) = query.get_mut(key.buffer).map_err(|_| BufferError::BufferMissing)?;
581578
Ok(AnyBufferMut {
582579
storage: Box::new(storage),
583580
gate,
@@ -666,22 +663,22 @@ impl<T: 'static + Send + Sync + Any> AnyBufferAccessInterface for AnyBufferAcces
666663
}
667664

668665
pub struct DrainAnyBuffer<'a> {
669-
inner: Box<dyn DrainAnyBufferImpl + 'a>,
666+
interface: Box<dyn DrainAnyBufferInterface + 'a>,
670667
}
671668

672669
impl<'a> Iterator for DrainAnyBuffer<'a> {
673670
type Item = AnyMessage;
674671

675672
fn next(&mut self) -> Option<Self::Item> {
676-
self.inner.any_next()
673+
self.interface.any_next()
677674
}
678675
}
679676

680-
trait DrainAnyBufferImpl {
677+
trait DrainAnyBufferInterface {
681678
fn any_next(&mut self) -> Option<AnyMessage>;
682679
}
683680

684-
impl<T: 'static + Send + Sync + Any> DrainAnyBufferImpl for DrainBuffer<'_, T> {
681+
impl<T: 'static + Send + Sync + Any> DrainAnyBufferInterface for DrainBuffer<'_, T> {
685682
fn any_next(&mut self) -> Option<AnyMessage> {
686683
self.next().map(to_any_message)
687684
}

0 commit comments

Comments
 (0)