Struct linera_views::views::collection_view::CollectionView
source · pub struct CollectionView<C, I, W> { /* private fields */ }
Expand description
A view that supports accessing a collection of views of the same kind, indexed by a key, one subview at a time.
Implementations§
source§impl<C, I, W> CollectionView<C, I, W>
impl<C, I, W> CollectionView<C, I, W>
sourcepub async fn load_entry_mut<Q>(
&mut self,
index: &Q,
) -> Result<&mut W, ViewError>
pub async fn load_entry_mut<Q>( &mut self, index: &Q, ) -> Result<&mut W, ViewError>
Loads a subview for the data at the given index in the collection. If an entry is absent then a default entry is added to the collection. The resulting view can be modified.
let mut view: CollectionView<_, u64, RegisterView<_, String>> =
CollectionView::load(context).await.unwrap();
let subview = view.load_entry_mut(&23).await.unwrap();
let value = subview.get();
assert_eq!(*value, String::default());
sourcepub async fn load_entry_or_insert<Q>(
&mut self,
index: &Q,
) -> Result<&W, ViewError>
pub async fn load_entry_or_insert<Q>( &mut self, index: &Q, ) -> Result<&W, ViewError>
Loads a subview for the data at the given index in the collection. If an entry is absent then a default entry is added to the collection. The resulting view is read-only.
let mut view: CollectionView<_, u64, RegisterView<_, String>> =
CollectionView::load(context).await.unwrap();
view.load_entry_mut(&23).await.unwrap();
let subview = view.load_entry_or_insert(&23).await.unwrap();
let value = subview.get();
assert_eq!(*value, String::default());
sourcepub async fn try_load_entry<Q>(
&self,
index: &Q,
) -> Result<Option<ReadGuardedView<'_, W>>, ViewError>
pub async fn try_load_entry<Q>( &self, index: &Q, ) -> Result<Option<ReadGuardedView<'_, W>>, ViewError>
Loads a subview for the data at the given index in the collection. If an entry
is absent then None
is returned. The resulting view cannot be modified.
May fail if one subview is already being visited.
let mut view: CollectionView<_, u64, RegisterView<_, String>> =
CollectionView::load(context).await.unwrap();
{
let _subview = view.load_entry_or_insert(&23).await.unwrap();
}
{
let subview = view.try_load_entry(&23).await.unwrap().unwrap();
let value = subview.get();
assert_eq!(*value, String::default());
}
assert!(view.try_load_entry(&24).await.unwrap().is_none());
sourcepub fn reset_entry_to_default<Q>(&mut self, index: &Q) -> Result<(), ViewError>
pub fn reset_entry_to_default<Q>(&mut self, index: &Q) -> Result<(), ViewError>
Resets an entry to the default value.
let mut view: CollectionView<_, u64, RegisterView<_, String>> =
CollectionView::load(context).await.unwrap();
let subview = view.load_entry_mut(&23).await.unwrap();
let value = subview.get_mut();
*value = String::from("Hello");
view.reset_entry_to_default(&23).unwrap();
let subview = view.load_entry_mut(&23).await.unwrap();
let value = subview.get_mut();
assert_eq!(*value, String::default());
sourcepub fn remove_entry<Q>(&mut self, index: &Q) -> Result<(), ViewError>
pub fn remove_entry<Q>(&mut self, index: &Q) -> Result<(), ViewError>
Removes an entry from the CollectionView
. If absent nothing happens.
let mut view: CollectionView<_, u64, RegisterView<_, String>> =
CollectionView::load(context).await.unwrap();
let subview = view.load_entry_mut(&23).await.unwrap();
let value = subview.get_mut();
assert_eq!(*value, String::default());
view.remove_entry(&23);
let keys = view.indices().await.unwrap();
assert_eq!(keys.len(), 0);
source§impl<C, I, W> CollectionView<C, I, W>
impl<C, I, W> CollectionView<C, I, W>
sourcepub async fn indices(&self) -> Result<Vec<I>, ViewError>
pub async fn indices(&self) -> Result<Vec<I>, ViewError>
Returns the list of indices in the collection in the order determined by the serialization.
let mut view: CollectionView<_, u64, RegisterView<_, String>> =
CollectionView::load(context).await.unwrap();
view.load_entry_mut(&23).await.unwrap();
view.load_entry_mut(&25).await.unwrap();
let indices = view.indices().await.unwrap();
assert_eq!(indices.len(), 2);
sourcepub async fn count(&self) -> Result<usize, ViewError>
pub async fn count(&self) -> Result<usize, ViewError>
Returns the number of entries in the collection.
let mut view: CollectionView<_, u64, RegisterView<_, String>> =
CollectionView::load(context).await.unwrap();
view.load_entry_mut(&23).await.unwrap();
view.load_entry_mut(&25).await.unwrap();
assert_eq!(view.count().await.unwrap(), 2);
source§impl<C, I, W> CollectionView<C, I, W>
impl<C, I, W> CollectionView<C, I, W>
sourcepub async fn for_each_index_while<F>(&self, f: F) -> Result<(), ViewError>
pub async fn for_each_index_while<F>(&self, f: F) -> Result<(), ViewError>
Applies a function f on each index. Indices are visited in an order determined by the serialization. If the function returns false then the loop ends prematurely.
let mut view: CollectionView<_, u64, RegisterView<_, String>> =
CollectionView::load(context).await.unwrap();
view.load_entry_mut(&23).await.unwrap();
view.load_entry_mut(&24).await.unwrap();
let mut count = 0;
view.for_each_index_while(|_key| {
count += 1;
Ok(count < 1)
})
.await
.unwrap();
assert_eq!(count, 1);
sourcepub async fn for_each_index<F>(&self, f: F) -> Result<(), ViewError>
pub async fn for_each_index<F>(&self, f: F) -> Result<(), ViewError>
Applies a function f on each index. Indices are visited in an order determined by the serialization.
let mut view: CollectionView<_, u64, RegisterView<_, String>> =
CollectionView::load(context).await.unwrap();
view.load_entry_mut(&23).await.unwrap();
view.load_entry_mut(&28).await.unwrap();
let mut count = 0;
view.for_each_index(|_key| {
count += 1;
Ok(())
})
.await
.unwrap();
assert_eq!(count, 2);
Trait Implementations§
source§impl<C, I, W> ClonableView<C> for CollectionView<C, I, W>
impl<C, I, W> ClonableView<C> for CollectionView<C, I, W>
source§fn clone_unchecked(&mut self) -> Result<Self, ViewError>
fn clone_unchecked(&mut self) -> Result<Self, ViewError>
source§impl<C, K, V> ContainerType for CollectionView<C, K, V>where
C: Send + Sync + Context,
K: InputType + OutputType + Serialize + DeserializeOwned + Debug + Clone,
V: View<C> + OutputType,
MapInput<K>: InputType,
MapFilters<K>: InputType,
impl<C, K, V> ContainerType for CollectionView<C, K, V>where
C: Send + Sync + Context,
K: InputType + OutputType + Serialize + DeserializeOwned + Debug + Clone,
V: View<C> + OutputType,
MapInput<K>: InputType,
MapFilters<K>: InputType,
source§async fn resolve_field(&self, ctx: &Context<'_>) -> ServerResult<Option<Value>>
async fn resolve_field(&self, ctx: &Context<'_>) -> ServerResult<Option<Value>>
async_graphql::Value
. Read moresource§async fn find_entity(
&self,
ctx: &Context<'_>,
params: &Value,
) -> ServerResult<Option<Value>>
async fn find_entity( &self, ctx: &Context<'_>, params: &Value, ) -> ServerResult<Option<Value>>
source§fn collect_all_fields<'a>(
&'a self,
ctx: &ContextBase<'a, &'a Positioned<SelectionSet>>,
fields: &mut Fields<'a>,
) -> Result<(), ServerError>
fn collect_all_fields<'a>( &'a self, ctx: &ContextBase<'a, &'a Positioned<SelectionSet>>, fields: &mut Fields<'a>, ) -> Result<(), ServerError>
source§impl<C, I, W> HashableView<C> for CollectionView<C, I, W>
impl<C, I, W> HashableView<C> for CollectionView<C, I, W>
§type Hasher = CoreWrapper<Sha3_256Core>
type Hasher = CoreWrapper<Sha3_256Core>
source§impl<C, K, V> OutputType for CollectionView<C, K, V>where
C: Send + Sync + Context,
K: InputType + OutputType + Serialize + DeserializeOwned + Debug + Clone,
V: View<C> + OutputType,
MapInput<K>: InputType,
MapFilters<K>: InputType,
impl<C, K, V> OutputType for CollectionView<C, K, V>where
C: Send + Sync + Context,
K: InputType + OutputType + Serialize + DeserializeOwned + Debug + Clone,
V: View<C> + OutputType,
MapInput<K>: InputType,
MapFilters<K>: InputType,
source§fn create_type_info(registry: &mut Registry) -> String
fn create_type_info(registry: &mut Registry) -> String
source§async fn resolve(
&self,
ctx: &ContextSelectionSet<'_>,
_field: &Positioned<Field>,
) -> ServerResult<Value>
async fn resolve( &self, ctx: &ContextSelectionSet<'_>, _field: &Positioned<Field>, ) -> ServerResult<Value>
async_graphql::Value
.source§fn qualified_type_name() -> String
fn qualified_type_name() -> String
source§impl<C: Send + Sync, K: OutputType, V: OutputType> TypeName for CollectionView<C, K, V>
impl<C: Send + Sync, K: OutputType, V: OutputType> TypeName for CollectionView<C, K, V>
source§impl<C, I, W> View<C> for CollectionView<C, I, W>
impl<C, I, W> View<C> for CollectionView<C, I, W>
source§const NUM_INIT_KEYS: usize = 0usize
const NUM_INIT_KEYS: usize = 0usize
source§fn pre_load(context: &C) -> Result<Vec<Vec<u8>>, ViewError>
fn pre_load(context: &C) -> Result<Vec<Vec<u8>>, ViewError>
source§fn post_load(context: C, values: &[Option<Vec<u8>>]) -> Result<Self, ViewError>
fn post_load(context: C, values: &[Option<Vec<u8>>]) -> Result<Self, ViewError>
source§fn load<'async_trait>(
context: C,
) -> Pin<Box<dyn Future<Output = Result<Self, ViewError>> + Send + 'async_trait>>where
Self: 'async_trait,
fn load<'async_trait>(
context: C,
) -> Pin<Box<dyn Future<Output = Result<Self, ViewError>> + Send + 'async_trait>>where
Self: 'async_trait,
source§fn rollback(&mut self)
fn rollback(&mut self)
flush
should have no effect to storage.source§fn has_pending_changes<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = bool> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn has_pending_changes<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = bool> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
true
if flushing this view would result in changes to the persistent storage.source§fn flush(&mut self, batch: &mut Batch) -> Result<bool, ViewError>
fn flush(&mut self, batch: &mut Batch) -> Result<bool, ViewError>
batch
variable first. If the view is dropped without calling flush
, staged
changes are simply lost.
The returned boolean indicates whether the operation removes the view or not.impl<C, K, V> ObjectType for CollectionView<C, K, V>where
C: Send + Sync + Context,
K: InputType + OutputType + Serialize + DeserializeOwned + Debug + Clone,
V: View<C> + OutputType,
MapInput<K>: InputType,
MapFilters<K>: InputType,
Auto Trait Implementations§
impl<C, I, W> !Freeze for CollectionView<C, I, W>
impl<C, I, W> !RefUnwindSafe for CollectionView<C, I, W>
impl<C, I, W> Send for CollectionView<C, I, W>
impl<C, I, W> Sync for CollectionView<C, I, W>
impl<C, I, W> Unpin for CollectionView<C, I, W>
impl<C, I, W> UnwindSafe for CollectionView<C, I, W>
Blanket Implementations§
source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
source§impl<T> MockResults for T
impl<T> MockResults for T
§type Results = T
type Results = T
MockInstance
.source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<M, I> RuntimeMemory<&mut I> for Mwhere
M: RuntimeMemory<I>,
impl<M, I> RuntimeMemory<&mut I> for Mwhere
M: RuntimeMemory<I>,
source§fn read<'instance>(
&self,
instance: &'instance &mut I,
location: GuestPointer,
length: u32,
) -> Result<Cow<'instance, [u8]>, RuntimeError>
fn read<'instance>( &self, instance: &'instance &mut I, location: GuestPointer, length: u32, ) -> Result<Cow<'instance, [u8]>, RuntimeError>
Reads length
bytes from memory from the provided location
.
source§fn write(
&mut self,
instance: &mut &mut I,
location: GuestPointer,
bytes: &[u8],
) -> Result<(), RuntimeError>
fn write( &mut self, instance: &mut &mut I, location: GuestPointer, bytes: &[u8], ) -> Result<(), RuntimeError>
Writes the bytes
to memory at the provided location
.