Struct RelaySelector

Source
pub struct RelaySelector<'a> {
    usage: Restr<'a>,
    exclusion: Restr<'a>,
    other_restrictions: Vec<Restr<'a>>,
}
Expand description

Description of the requirements that a relay must implement in order to be selected.

This object is used to pick a Relay from a NetDir, or to ensure that a previously selected Relay still meets its requirements.

The requirements on a relay can be strict or flexible. If any restriction is flexible, and relay selection fails at first, we relax the RelaySelector by removing that restriction, and trying again, before we give up completely.

Fields§

§usage: Restr<'a>

A usage that the relay must support.

Invariant: This is a RelayUsage.

§exclusion: Restr<'a>

An excludion that the relay must obey.

Invariant: This a RelayExclusion.

§other_restrictions: Vec<Restr<'a>>

Other restrictions that a Relay must obey in order to be selected.

Implementations§

Source§

impl<'a> RelaySelector<'a>

Source

pub fn new(usage: RelayUsage, exclusion: RelayExclusion<'a>) -> Self

Create a new RelaySelector to pick relays with a given RelayUsage and RelayExclusion.

Both arguments are required, since every caller should consider them explicitly.

The provided usage and exclusion are strict by default.

Source

pub fn mark_usage_flexible(&mut self)

Mark the originally provided RelayUsage as flexible.

Source

pub fn mark_exclusion_flexible(&mut self)

Mark the originally provided RelayExclusion as flexible.

Source

pub fn push_restriction(&mut self, restriction: RelayRestriction<'a>)

Add a new strict RelayRestriction to this selector.

Source

pub fn push_flexible_restriction(&mut self, restriction: RelayRestriction<'a>)

Add a new flexible RelayRestriction to this selector.

Source

fn push_inner(&mut self, restriction: RelayRestriction<'a>, strict: bool)

Helper to implement adding a new restriction.

Source

pub fn usage(&self) -> &RelayUsage

Return the usage for this selector.

Source

fn weight_role(&self) -> WeightRole

Return the WeightRole to use when randomly picking relays according to this selector.

Source

pub fn permits_relay(&self, relay: &Relay<'_>) -> bool

Return true if relay is one that this selector would pick.

Source

fn all_restrictions(&self) -> impl Iterator<Item = &Restr<'a>>

Return an iterator that yields each restriction from this selector, including the usage and exclusion.

Source

fn n_restrictions(&self) -> usize

Return the number of restrictions in this selector, including the usage and exclusion.

Source

pub fn select_relay<'s, 'd, R: Rng>( &'s self, rng: &mut R, netdir: &'d NetDir, ) -> (Option<Relay<'d>>, SelectionInfo<'s>)

Try to pick a random relay from netdir, according to the rules of this selector.

Source

pub fn select_n_relays<'s, 'd, R: Rng>( &'s self, rng: &mut R, n_relays: usize, netdir: &'d NetDir, ) -> (Vec<Relay<'d>>, SelectionInfo<'s>)

Try to pick n_relays distinct random relay from netdir, according to the rules of this selector.

Source

fn relay_usable(&self, r: &Relay<'_>, fc: &mut FilterCounts) -> bool

Check whether a given relay r obeys the restrictions of this selector, updating fc according to which restrictions (if any) accepted or rejected it.

Requires that fc has the same length as self.restrictions.

This differs from <Self as RelayPredicate>::permits_relay in taking fc as an argument.

Source

fn can_relax(&self) -> bool

Return true if this selector has any flexible restrictions.

Source

fn relax(&self) -> Self

Return a new selector created by relaxing every flexible restriction in this selector.

Trait Implementations§

Source§

impl<'a> Clone for RelaySelector<'a>

Source§

fn clone(&self) -> RelaySelector<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for RelaySelector<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> LowLevelRelayPredicate for RelaySelector<'a>

Source§

fn low_level_predicate_permits_relay(&self, relay: &Relay<'_>) -> bool

Return true if relay provides this predicate.

Auto Trait Implementations§

§

impl<'a> Freeze for RelaySelector<'a>

§

impl<'a> RefUnwindSafe for RelaySelector<'a>

§

impl<'a> Send for RelaySelector<'a>

§

impl<'a> Sync for RelaySelector<'a>

§

impl<'a> Unpin for RelaySelector<'a>

§

impl<'a> UnwindSafe for RelaySelector<'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
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DynClone for T
where T: Clone,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,