macro_rules! find_in_tracker {
{
// This `+` is needed because otherwise it's LL1-ambiguous and macro_rules can't cope
$enabled:expr;
$tracker_input:expr => $( + $tracker:ident, )? $state:ident;
$aid:expr => $arecord:ident;
$( $pid:expr => $precord:ident; )?
// Either `Error` or None, to be passed to `find_in_tracker_eh!($eh ...: ...)`
// (We need this to be an un-repeated un-optional binding, because
// it is used within some other $( ... )?, and macro_rules gets confused.)
? $eh:tt
} => { ... };
}Expand description
Given a &Weak<MemoryQuotaTracker>, find an account and maybe participant
§Usage templates
ⓘ
find_in_tracker! {
enabled;
weak_tracker => + tracker, state;
aid => arecord;
[ pid => precord; ]
[ ?Error | ?None ]
};
find_in_tracker! {
enabled;
strong_tracker => state;
.. // as above
};§Input expressions (value arguments to the macro0
weak_tracker: &Weak<MemoryQuotaTracker>(or equivalent)strong_tracker: &MemoryQuotaTracker(or equivalent)enabled: EnabledToken(or equivalent)aid: AIdpid: PId
§Generated bindings (identifier arguments to the macro)
tracker: Arc<MemoryQuotaTracker>state: &mut State(borrowed from aMutexGuard<State>borrowed fromtracker)arecord: &mut ARecord(mut borrowed fromstate.accounts)precord: &mut PRecord(mut borrowed fromarecord.ps)
There is no access to the MutexGuard itself.
For control of the mutex release point, place find_in_tracker! in an enclosing block.
§Error handling
If the tracker, account, or participant, can’t be found,
the macro returns early from the enclosing scope (using ?).
If Error is specified, applies ? to Err(Error::...).
If None is specified, just returns None (by applying ? to None`).