@@ -37,7 +37,7 @@ use smallvec::SmallVec;
37
37
38
38
use crate :: {
39
39
AnyBufferAccessImpl , AnyBufferAccessInterface , AnyBuffer , AnyBufferKey ,
40
- AnyRange , Buffer , BufferAccessors , BufferAccess , BufferKey , BufferKeyBuilder ,
40
+ AnyRange , Buffer , BufferAccessors , BufferKey , BufferKeyBuilder ,
41
41
BufferAccessLifecycle , BufferAccessMut , BufferError , BufferStorage , Builder ,
42
42
DrainBuffer , OperationError , OperationResult , InspectBuffer , ManageBuffer ,
43
43
Gate , GateState , NotifyBufferUpdate , Bufferable , Buffered , OrBroken , Joined ,
@@ -177,7 +177,6 @@ impl From<JsonBufferKey> for AnyBufferKey {
177
177
pub struct JsonBufferView < ' a > {
178
178
storage : Box < dyn JsonBufferViewing + ' a > ,
179
179
gate : & ' a GateState ,
180
- buffer : Entity ,
181
180
session : Entity ,
182
181
}
183
182
@@ -412,15 +411,13 @@ pub trait JsonBufferWorldAccess {
412
411
/// Call this to get read-only access to any buffer whose message type is
413
412
/// serializable and deserializable.
414
413
///
415
- /// Pass in a callback that will receive a [`JsonBufferView`] alongside a
416
- /// shared borrow of the [`World`]. Due to technical reasons this function
417
- /// needs to be called on a `&mut World`, but you can still view the world
418
- /// from inside the callback using the second argument.
419
- fn json_buffer_view < U > (
420
- & mut self ,
414
+ /// For technical reasons this requires direct [`World`] access, but you can
415
+ /// do other read-only queries on the world while holding onto the
416
+ /// [`JsonBufferView`].
417
+ fn json_buffer_view (
418
+ & self ,
421
419
key : & JsonBufferKey ,
422
- f : impl FnOnce ( JsonBufferView , & World ) -> U ,
423
- ) -> Result < U , BufferError > ;
420
+ ) -> Result < JsonBufferView < ' _ > , BufferError > ;
424
421
425
422
/// Call this to get mutable access to any buffer whose message type is
426
423
/// serializable and deserializable.
@@ -435,16 +432,11 @@ pub trait JsonBufferWorldAccess {
435
432
}
436
433
437
434
impl JsonBufferWorldAccess for World {
438
- fn json_buffer_view < U > (
439
- & mut self ,
435
+ fn json_buffer_view (
436
+ & self ,
440
437
key : & JsonBufferKey ,
441
- f : impl FnOnce ( JsonBufferView , & World ) -> U ,
442
- ) -> Result < U , BufferError > {
443
- let interface = key. interface ;
444
- let mut state = interface. create_json_buffer_access_state ( self ) ;
445
- let access = state. get_json_buffer_access ( self ) ;
446
- let buffer_view = access. as_json_buffer_view ( key) ?;
447
- Ok ( f ( buffer_view, & self ) )
438
+ ) -> Result < JsonBufferView < ' _ > , BufferError > {
439
+ key. interface . create_json_buffer_view ( key, self )
448
440
}
449
441
450
442
fn json_buffer_mut < U > (
@@ -695,10 +687,11 @@ trait JsonBufferAccessInterface {
695
687
session : Entity ,
696
688
) -> Result < JsonMessage , OperationError > ;
697
689
698
- fn create_json_buffer_access_state (
690
+ fn create_json_buffer_view < ' a > (
699
691
& self ,
700
- world : & mut World ,
701
- ) -> Box < dyn JsonBufferAccessState > ;
692
+ key : & JsonBufferKey ,
693
+ world : & ' a World ,
694
+ ) -> Result < JsonBufferView < ' a > , BufferError > ;
702
695
703
696
fn create_json_buffer_access_mut_state (
704
697
& self ,
@@ -764,11 +757,19 @@ impl<T: 'static + Send + Sync + Serialize + DeserializeOwned> JsonBufferAccessIn
764
757
serde_json:: to_value ( value) . or_broken ( )
765
758
}
766
759
767
- fn create_json_buffer_access_state (
760
+ fn create_json_buffer_view < ' a > (
768
761
& self ,
769
- world : & mut World ,
770
- ) -> Box < dyn JsonBufferAccessState > {
771
- Box :: new ( SystemState :: < BufferAccess < T > > :: new ( world) )
762
+ key : & JsonBufferKey ,
763
+ world : & ' a World ,
764
+ ) -> Result < JsonBufferView < ' a > , BufferError > {
765
+ let buffer_ref = world. get_entity ( key. buffer ) . ok_or ( BufferError :: BufferMissing ) ?;
766
+ let storage = buffer_ref. get :: < BufferStorage < T > > ( ) . ok_or ( BufferError :: BufferMissing ) ?;
767
+ let gate = buffer_ref. get :: < GateState > ( ) . ok_or ( BufferError :: BufferMissing ) ?;
768
+ Ok ( JsonBufferView {
769
+ storage : Box :: new ( storage) ,
770
+ gate,
771
+ session : key. session ,
772
+ } )
772
773
}
773
774
774
775
fn create_json_buffer_access_mut_state (
@@ -779,19 +780,6 @@ impl<T: 'static + Send + Sync + Serialize + DeserializeOwned> JsonBufferAccessIn
779
780
}
780
781
}
781
782
782
- trait JsonBufferAccessState {
783
- fn get_json_buffer_access < ' s , ' w : ' s > ( & ' s mut self , world : & ' w World ) -> Box < dyn JsonBufferAccess < ' w , ' s > + ' s > ;
784
- }
785
-
786
- impl < T > JsonBufferAccessState for SystemState < BufferAccess < ' static , ' static , T > >
787
- where
788
- T : ' static + Send + Sync + Serialize + DeserializeOwned ,
789
- {
790
- fn get_json_buffer_access < ' s , ' w : ' s > ( & ' s mut self , world : & ' w World ) -> Box < dyn JsonBufferAccess < ' w , ' s > + ' s > {
791
- Box :: new ( self . get ( world) )
792
- }
793
- }
794
-
795
783
trait JsonBufferAccessMutState {
796
784
fn get_json_buffer_access_mut < ' s , ' w : ' s > ( & ' s mut self , world : & ' w mut World ) -> Box < dyn JsonBufferAccessMut < ' w , ' s > + ' s > ;
797
785
}
@@ -805,26 +793,6 @@ where
805
793
}
806
794
}
807
795
808
- trait JsonBufferAccess < ' w , ' s > {
809
- fn as_json_buffer_view < ' a > ( & ' a self , key : & JsonBufferKey ) -> Result < JsonBufferView < ' a > , BufferError > ;
810
- }
811
-
812
- impl < ' w , ' s , T > JsonBufferAccess < ' w , ' s > for BufferAccess < ' w , ' s , T >
813
- where
814
- T : ' static + Send + Sync + Serialize + DeserializeOwned ,
815
- {
816
- fn as_json_buffer_view < ' a > ( & ' a self , key : & JsonBufferKey ) -> Result < JsonBufferView < ' a > , BufferError > {
817
- let BufferAccess { query } = self ;
818
- let ( storage, gate) = query. get ( key. buffer ) . map_err ( |_| BufferError :: BufferMissing ) ?;
819
- Ok ( JsonBufferView {
820
- storage : Box :: new ( storage) ,
821
- gate,
822
- buffer : key. buffer ,
823
- session : key. session ,
824
- } )
825
- }
826
- }
827
-
828
796
trait JsonBufferAccessMut < ' w , ' s > {
829
797
fn as_json_buffer_mut < ' a > ( & ' a mut self , key : & JsonBufferKey ) -> Result < JsonBufferMut < ' w , ' s , ' a > , BufferError > ;
830
798
}
@@ -1022,9 +990,7 @@ mod tests {
1022
990
In ( key) : In < JsonBufferKey > ,
1023
991
world : & mut World ,
1024
992
) -> usize {
1025
- world. json_buffer_view ( & key, |access, _| {
1026
- access. len ( )
1027
- } ) . unwrap ( )
993
+ world. json_buffer_view ( & key) . unwrap ( ) . len ( )
1028
994
}
1029
995
1030
996
#[ test]
0 commit comments