multiversx_sc_scenario::imports

Struct UserMapper

Source
pub struct UserMapper<SA, A = CurrentStorage>
where SA: StorageMapperApi, A: StorageAddress<SA>,
{ /* private fields */ }
Expand description

Very widely used mapper, that manages the users of a smart contract. It holds a bi-directional map, from addresses to ids and viceversa. This is so we can easily iterate over all users, using their ids. Also holds the user count in sync. This is also necessary for iteration.

This particular implementation of a user mapper doesn’t contain any additional user data other than address/id.

It also doesn’t allow removing users. Once in, their ids are reserved forever.

Implementations§

Source§

impl<SA, A> UserMapper<SA, A>
where SA: StorageMapperApi, A: StorageAddress<SA>,

Source

pub fn get_user_id(&self, address: &ManagedAddress<SA>) -> usize

Yields the user id for a given address. Will return 0 if the address is not known to the contract.

Source

pub fn get_user_address(&self, id: usize) -> Option<ManagedAddress<SA>>

Yields the user address for a given id, if the id is valid.

Source

pub fn get_user_address_unchecked(&self, id: usize) -> ManagedAddress<SA>

Yields the user address for a given id. Will cause a deserialization error if the id is invalid.

Source

pub fn get_user_address_or_zero(&self, id: usize) -> ManagedAddress<SA>

Yields the user address for a given id, if the id is valid. Otherwise returns the zero address (0x000…)

Source

pub fn get_user_count(&self) -> usize

Number of users.

Source

pub fn get_all_addresses(&self) -> ManagedVec<SA, ManagedAddress<SA>>

Loads all addresses from storage and places them in a ManagedVec. Can easily consume a lot of gas.

Source§

impl<SA> UserMapper<SA>
where SA: StorageMapperApi,

Source

pub fn get_or_create_users<AddressIter, F>( &self, address_iter: AddressIter, user_id_lambda: F, )
where AddressIter: Iterator<Item = ManagedAddress<SA>>, F: FnMut(usize, bool),

Tries to insert a number of addresses. Calls a lambda function for each, with the new user id and whether of nor the user was already present.

Source

pub fn get_or_create_user(&self, address: &ManagedAddress<SA>) -> usize

Yields the user id for a given address, or creates a new user id if there isn’t one. Will safely keep the user count in sync.

Trait Implementations§

Source§

impl<SA> StorageMapper<SA> for UserMapper<SA>
where SA: StorageMapperApi,

Source§

fn new(base_key: StorageKey<SA>) -> UserMapper<SA>

Will be called automatically by the #[storage_mapper] annotation generated code.
Source§

impl<SA> StorageMapperFromAddress<SA> for UserMapper<SA, ManagedAddress<SA>>
where SA: StorageMapperApi,

Source§

fn new_from_address( address: ManagedAddress<SA>, base_key: StorageKey<SA>, ) -> UserMapper<SA, ManagedAddress<SA>>

Will be called automatically by the #[storage_mapper_from_address] annotation generated code.
Source§

impl<SA> TopEncodeMulti for UserMapper<SA>
where SA: StorageMapperApi,

Behaves like a MultiResultVec

when an endpoint result, and lists all users addresses.

Source§

fn multi_encode_or_handle_err<O, H>( &self, output: &mut O, h: H, ) -> Result<(), <H as EncodeErrorHandler>::HandledErr>

Version of top_encode that can handle errors as soon as they occur. For instance in can exit immediately and make sure that if it returns, it is a success. By not deferring error handling, this can lead to somewhat smaller bytecode.
Source§

fn multi_encode<O>(&self, output: &mut O) -> Result<(), EncodeError>

Attempt to serialize the value to ouput.
Source§

impl<SA> TypeAbi for UserMapper<SA>
where SA: StorageMapperApi,

Behaves like a MultiResultVec when an endpoint result.

Source§

type Unmanaged = UserMapper<SA>

Source§

fn type_name() -> String

Source§

fn type_name_rust() -> String

Source§

fn type_names() -> TypeNames

Source§

fn provide_type_descriptions<TDC>(accumulator: &mut TDC)

A type can provide more than its own name. For instance, a struct can also provide the descriptions of the type of its fields. TypeAbi doesn’t care for the exact accumulator type, which is abstracted by the TypeDescriptionContainer trait.
Source§

impl<SA> TypeAbiFrom<UserMapper<SA>> for MultiValueEncoded<SA, ManagedAddress<SA>>
where SA: StorageMapperApi,

Source§

impl<SA> TypeAbiFrom<UserMapper<SA>> for UserMapper<SA>
where SA: StorageMapperApi,

Auto Trait Implementations§

§

impl<SA, A> Freeze for UserMapper<SA, A>

§

impl<SA, A> RefUnwindSafe for UserMapper<SA, A>

§

impl<SA, A> Send for UserMapper<SA, A>
where A: Send, SA: Send, <SA as HandleTypeInfo>::ManagedBufferHandle: Send,

§

impl<SA, A> Sync for UserMapper<SA, A>
where A: Sync, SA: Sync, <SA as HandleTypeInfo>::ManagedBufferHandle: Sync,

§

impl<SA, A> Unpin for UserMapper<SA, A>

§

impl<SA, A> UnwindSafe for UserMapper<SA, A>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> InterpretableFrom<T> for T

Source§

fn interpret_from(from: T, _context: &InterpreterContext) -> T

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> ReconstructableFrom<T> for T

Source§

fn reconstruct_from(from: T, _builder: &ReconstructorContext) -> T

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<O, T> ProxyArg<O> for T
where O: TypeAbiFrom<T>, T: TopEncodeMulti,