@@ -30,7 +30,7 @@ use bevy_ecs::{
30
30
use thiserror:: Error as ThisError ;
31
31
32
32
use crate :: {
33
- Buffer , BufferAccessLifecycle , BufferAccessMut , BufferKey , BufferStorage ,
33
+ Buffer , BufferAccessLifecycle , BufferAccessMut , BufferError , BufferKey , BufferStorage ,
34
34
DrainBuffer , NotifyBufferUpdate , GateState , Gate , OperationResult , OperationError ,
35
35
InspectBuffer , ManageBuffer ,
36
36
} ;
@@ -80,8 +80,8 @@ impl<T: 'static + Send + Sync + Any> From<Buffer<T>> for AnyBuffer {
80
80
}
81
81
}
82
82
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.
85
85
///
86
86
/// Use this with [`AnyBufferAccess`] to directly view or manipulate the contents
87
87
/// of a buffer.
@@ -97,7 +97,7 @@ pub struct AnyBufferKey {
97
97
impl std:: fmt:: Debug for AnyBufferKey {
98
98
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
99
99
f
100
- . debug_struct ( "DynBufferKey " )
100
+ . debug_struct ( "AnyBufferKey " )
101
101
. field ( "buffer" , & self . buffer )
102
102
. field ( "session" , & self . session )
103
103
. field ( "accessor" , & self . accessor )
@@ -216,7 +216,7 @@ impl<'w, 's, 'a> AnyBufferMut<'w, 's, 'a> {
216
216
pub fn drain < R : RangeBounds < usize > > ( & mut self , range : R ) -> DrainAnyBuffer < ' _ > {
217
217
self . modified = true ;
218
218
DrainAnyBuffer {
219
- inner : self . storage . any_drain ( self . session , AnyRange :: new ( range) )
219
+ interface : self . storage . any_drain ( self . session , AnyRange :: new ( range) )
220
220
}
221
221
}
222
222
@@ -349,31 +349,25 @@ impl<'w, 's, 'a> Drop for AnyBufferMut<'w, 's, 'a> {
349
349
}
350
350
}
351
351
352
- #[ derive( ThisError , Debug , Clone ) ]
353
- pub enum AnyBufferError {
354
- #[ error( "The key was unable to identify a buffer" ) ]
355
- BufferMissing ,
356
- }
357
-
358
352
/// This trait allows [`World`] to give you access to any buffer using an
359
353
/// [`AnyBufferKey`].
360
354
pub trait AnyBufferWorldAccess {
361
355
fn any_buffer_mut < U > (
362
356
& mut self ,
363
357
key : & AnyBufferKey ,
364
358
f : impl FnOnce ( AnyBufferMut ) -> U ,
365
- ) -> Result < U , AnyBufferError > ;
359
+ ) -> Result < U , BufferError > ;
366
360
}
367
361
368
362
impl AnyBufferWorldAccess for World {
369
363
fn any_buffer_mut < U > (
370
364
& mut self ,
371
365
key : & AnyBufferKey ,
372
366
f : impl FnOnce ( AnyBufferMut ) -> U ,
373
- ) -> Result < U , AnyBufferError > {
367
+ ) -> Result < U , BufferError > {
374
368
let interface = key. interface ;
375
369
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 ) ;
377
371
let buffer_mut = access. as_any_buffer_mut ( key) ?;
378
372
Ok ( f ( buffer_mut) )
379
373
}
@@ -395,10 +389,10 @@ trait AnyBufferManagement: AnyBufferViewing {
395
389
fn any_oldest_mut < ' a > ( & ' a mut self , session : Entity ) -> Option < AnyMessageMut < ' a > > ;
396
390
fn any_newest_mut < ' a > ( & ' a mut self , session : Entity ) -> Option < AnyMessageMut < ' a > > ;
397
391
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 > ;
399
393
}
400
394
401
- struct AnyRange {
395
+ pub ( crate ) struct AnyRange {
402
396
start_bound : std:: ops:: Bound < usize > ,
403
397
end_bound : std:: ops:: Bound < usize > ,
404
398
}
@@ -492,19 +486,21 @@ pub type AnyMessage = Box<dyn Any + 'static + Send + Sync>;
492
486
pub struct AnyMessageError {
493
487
/// The original value provided
494
488
pub value : AnyMessage ,
495
- /// The type expected by the buffer
489
+ /// The ID of the type expected by the buffer
496
490
pub type_id : TypeId ,
491
+ /// The name of the type expected by the buffer
492
+ pub type_name : & ' static str ,
497
493
}
498
494
499
495
pub type AnyMessagePushResult = Result < Option < AnyMessage > , AnyMessageError > ;
500
496
501
497
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 {
503
499
let value = from_any_message :: < T > ( value) ?;
504
500
Ok ( self . push ( session, value) . map ( to_any_message) )
505
501
}
506
502
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 {
508
504
let value = from_any_message :: < T > ( value) ?;
509
505
Ok ( self . push_as_oldest ( session, value) . map ( to_any_message) )
510
506
}
@@ -529,7 +525,7 @@ impl<T: 'static + Send + Sync + Any> AnyBufferManagement for Mut<'_, BufferStora
529
525
self . get_mut ( session, index) . map ( to_any_mut)
530
526
}
531
527
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 > {
533
529
Box :: new ( self . drain ( session, range) )
534
530
}
535
531
}
@@ -554,30 +550,31 @@ where
554
550
AnyMessageError {
555
551
value,
556
552
type_id : TypeId :: of :: < T > ( ) ,
553
+ type_name : std:: any:: type_name :: < T > ( ) ,
557
554
}
558
555
} ) ?;
559
556
560
557
Ok ( * value)
561
558
}
562
559
563
560
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 > ;
565
562
}
566
563
567
564
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 > {
569
566
Box :: new ( self . get_mut ( world) )
570
567
}
571
568
}
572
569
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 > ;
575
572
}
576
573
577
574
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 > {
579
576
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 ) ?;
581
578
Ok ( AnyBufferMut {
582
579
storage : Box :: new ( storage) ,
583
580
gate,
@@ -666,22 +663,22 @@ impl<T: 'static + Send + Sync + Any> AnyBufferAccessInterface for AnyBufferAcces
666
663
}
667
664
668
665
pub struct DrainAnyBuffer < ' a > {
669
- inner : Box < dyn DrainAnyBufferImpl + ' a > ,
666
+ interface : Box < dyn DrainAnyBufferInterface + ' a > ,
670
667
}
671
668
672
669
impl < ' a > Iterator for DrainAnyBuffer < ' a > {
673
670
type Item = AnyMessage ;
674
671
675
672
fn next ( & mut self ) -> Option < Self :: Item > {
676
- self . inner . any_next ( )
673
+ self . interface . any_next ( )
677
674
}
678
675
}
679
676
680
- trait DrainAnyBufferImpl {
677
+ trait DrainAnyBufferInterface {
681
678
fn any_next ( & mut self ) -> Option < AnyMessage > ;
682
679
}
683
680
684
- impl < T : ' static + Send + Sync + Any > DrainAnyBufferImpl for DrainBuffer < ' _ , T > {
681
+ impl < T : ' static + Send + Sync + Any > DrainAnyBufferInterface for DrainBuffer < ' _ , T > {
685
682
fn any_next ( & mut self ) -> Option < AnyMessage > {
686
683
self . next ( ) . map ( to_any_message)
687
684
}
0 commit comments