Struct aldrin::Discoverer

source ·
pub struct Discoverer<Key> { /* private fields */ }
Expand description

Discovers objects with multiple services on the bus.

Discovers are similar to BusListeners, in that they watch the bus for objects and services, and emit events in certain situations. The key difference is, that they focus on objects with specific sets of services. They then emit only one event, that gives access to all related IDs. A BusListeners on the other hand, would emit multiple events, one for the object and one per service.

The set of objects (and associated services) that a Discoverer looks for is configured in advance through a DiscovererBuilder, which can be created directly from a Handle:

let builder = Discoverer::builder(&handle);
let builder = DiscovererBuilder::new(&handle); // Alternative 1
let builder = handle.create_discoverer(); // Alternative 2

When configuring objects, you must choose whether the Discoverer matches only on a specific ObjectUuid or not. Set an ObjectUuid when you are looking for a single specific object on the bus. Do not set an ObjectUuid when you are looking for potentially multiple objects with the same set of services.

You can configure arbitrarily many objects. To help distinguish them when events are emitted, the Discoverer associates each object with a key. DiscovererEvents then give access to the key they are related to. Good candidates for keys are either integers or custom enums.

In the following example, a discoverer is configured for 2 different kinds of objects. One specific object with a fixed UUID and 2 services. And second, a class of objects with just 1 service.

const OBJECT_UUID: ObjectUuid = ObjectUuid(uuid!("730c1d68-212b-4181-9813-811948813809"));
const SERVICE_UUID_1: ServiceUuid = ServiceUuid(uuid!("25b952af-7447-4275-9a68-1f9b689d96a4"));
const SERVICE_UUID_2: ServiceUuid = ServiceUuid(uuid!("5456b1f9-5c2e-46b0-b0d7-bad82cbc957b"));

let mut discoverer = Discoverer::builder(&handle)
    .specific(1, OBJECT_UUID, [SERVICE_UUID_1, SERVICE_UUID_2])
    .any(2, [SERVICE_UUID_1])
    .build()
    .await?;

let mut obj = handle.create_object(OBJECT_UUID).await?;
let svc1 = obj.create_service(SERVICE_UUID_1, 0).await?;

// At this point, `obj` satisfies the requirements of the object configured with the key 2.
let ev = discoverer.next_event().await.unwrap();
assert_eq!(ev.key(), 2);
assert_eq!(ev.kind(), DiscovererEventKind::Created);
assert_eq!(ev.object_id(), obj.id());
assert_eq!(ev.service_id(&discoverer, SERVICE_UUID_1), svc1.id());

let svc2 = obj.create_service(SERVICE_UUID_2, 0).await?;

// Now `obj` completes the requirements the object configured with the key 1.
let ev = discoverer.next_event().await.unwrap();
assert_eq!(ev.key(), 1);
assert_eq!(ev.kind(), DiscovererEventKind::Created);
assert_eq!(ev.object_id(), obj.id());
assert_eq!(ev.service_id(&discoverer, SERVICE_UUID_1), svc1.id());
assert_eq!(ev.service_id(&discoverer, SERVICE_UUID_2), svc2.id());

Implementations§

source§

impl<Key> Discoverer<Key>
where Key: Copy + Eq + Hash,

source

pub fn builder(client: &Handle) -> DiscovererBuilder<'_, Key>

Create a builder for a Discoverer.

source

pub fn client(&self) -> &Handle

Returns a handle to the client that was used to create the discoverer.

source

pub async fn restart(&mut self) -> Result<(), Error>

Restarts the discoverer.

All pending events will be discarded. The discoverer will be configured to consider all objects and services on the bus, as if it was built again with DiscovererBuilder::build.

source

pub async fn restart_current_only(&mut self) -> Result<(), Error>

Restarts the discoverer and configures it to consider only current objects and services.

All pending events will be discarded. The discoverer will be configured to consider only current objects and services on the bus, as if it was built again with DiscovererBuilder::build_current_only.

source

pub fn is_finished(&self) -> bool

Indicates whether the discoverer can return more events.

Discoverers can only finish if they are considering only current objects and services, i.e. built with build_current_only or restarted with restart_current_only.

source

pub fn object_id(&self, key: Key, object: ObjectUuid) -> Option<ObjectId>

Queries a specific object ID.

source

pub fn service_id( &self, key: Key, object: ObjectUuid, service: ServiceUuid, ) -> Option<ServiceId>

Queries a specific service ID.

source

pub fn entry(&self, key: Key) -> Option<&DiscovererEntry<Key>>

Returns an entry of the Discoverer.

Entries are directly associated with the keys and correspond to the object, specific and any calls on the DiscovererBuilder.

source

pub fn iter(&self) -> DiscovererIter<'_, Key>

Returns an iterator over all found objects.

source

pub fn entry_iter(&self, key: Key) -> Option<DiscovererEntryIter<'_, Key>>

Returns an iterator over all found objects corresponding to a specific key.

source

pub fn poll_next_event( &mut self, cx: &mut Context<'_>, ) -> Poll<Option<DiscovererEvent<Key>>>

Polls the discoverer for an event.

source

pub async fn next_event(&mut self) -> Option<DiscovererEvent<Key>>

Awaits an event from the discoverer.

Trait Implementations§

source§

impl<Key: Debug> Debug for Discoverer<Key>

source§

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

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

impl<Key> FusedStream for Discoverer<Key>
where Key: Copy + Eq + Hash,

source§

fn is_terminated(&self) -> bool

Returns true if the stream should no longer be polled.
source§

impl<'a, Key> IntoIterator for &'a Discoverer<Key>
where Key: Copy + Eq + Hash,

§

type IntoIter = DiscovererIter<'a, Key>

Which kind of iterator are we turning this into?
§

type Item = DiscovererIterEntry<'a, Key>

The type of the elements being iterated over.
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl<Key> Stream for Discoverer<Key>
where Key: Copy + Eq + Hash,

§

type Item = DiscovererEvent<Key>

Values yielded by the stream.
source§

fn poll_next( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Option<Self::Item>>

Attempt to pull out the next value of this stream, registering the current task for wakeup if the value is not yet available, and returning None if the stream is exhausted. Read more
source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the stream. Read more
source§

impl<Key> Unpin for Discoverer<Key>

Auto Trait Implementations§

§

impl<Key> Freeze for Discoverer<Key>

§

impl<Key> !RefUnwindSafe for Discoverer<Key>

§

impl<Key> Send for Discoverer<Key>
where Key: Send,

§

impl<Key> Sync for Discoverer<Key>
where Key: Sync,

§

impl<Key> !UnwindSafe for Discoverer<Key>

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, 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> StreamExt for T
where T: Stream + ?Sized,

source§

fn next(&mut self) -> Next<'_, Self>
where Self: Unpin,

Creates a future that resolves to the next item in the stream. Read more
source§

fn into_future(self) -> StreamFuture<Self>
where Self: Sized + Unpin,

Converts this stream into a future of (next_item, tail_of_stream). If the stream terminates, then the next item is None. Read more
source§

fn map<T, F>(self, f: F) -> Map<Self, F>
where F: FnMut(Self::Item) -> T, Self: Sized,

Maps this stream’s items to a different type, returning a new stream of the resulting type. Read more
source§

fn enumerate(self) -> Enumerate<Self>
where Self: Sized,

Creates a stream which gives the current iteration count as well as the next value. Read more
source§

fn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F>
where F: FnMut(&Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Filters the values produced by this stream according to the provided asynchronous predicate. Read more
source§

fn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F>
where F: FnMut(Self::Item) -> Fut, Fut: Future<Output = Option<T>>, Self: Sized,

Filters the values produced by this stream while simultaneously mapping them to a different type according to the provided asynchronous closure. Read more
source§

fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
where F: FnMut(Self::Item) -> Fut, Fut: Future, Self: Sized,

Computes from this stream’s items new items of a different type using an asynchronous closure. Read more
source§

fn collect<C>(self) -> Collect<Self, C>
where C: Default + Extend<Self::Item>, Self: Sized,

Transforms a stream into a collection, returning a future representing the result of that computation. Read more
source§

fn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB>
where FromA: Default + Extend<A>, FromB: Default + Extend<B>, Self: Sized + Stream<Item = (A, B)>,

Converts a stream of pairs into a future, which resolves to pair of containers. Read more
source§

fn concat(self) -> Concat<Self>
where Self: Sized, Self::Item: Extend<<Self::Item as IntoIterator>::Item> + IntoIterator + Default,

Concatenate all items of a stream into a single extendable destination, returning a future representing the end result. Read more
source§

fn count(self) -> Count<Self>
where Self: Sized,

Drives the stream to completion, counting the number of items. Read more
source§

fn cycle(self) -> Cycle<Self>
where Self: Sized + Clone,

Repeats a stream endlessly. Read more
source§

fn fold<T, Fut, F>(self, init: T, f: F) -> Fold<Self, Fut, T, F>
where F: FnMut(T, Self::Item) -> Fut, Fut: Future<Output = T>, Self: Sized,

Execute an accumulating asynchronous computation over a stream, collecting all the values into one final result. Read more
source§

fn any<Fut, F>(self, f: F) -> Any<Self, Fut, F>
where F: FnMut(Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Execute predicate over asynchronous stream, and return true if any element in stream satisfied a predicate. Read more
source§

fn all<Fut, F>(self, f: F) -> All<Self, Fut, F>
where F: FnMut(Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Execute predicate over asynchronous stream, and return true if all element in stream satisfied a predicate. Read more
source§

fn flatten(self) -> Flatten<Self>
where Self::Item: Stream, Self: Sized,

Flattens a stream of streams into just one continuous stream. Read more
source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where F: FnMut(Self::Item) -> U, U: Stream, Self: Sized,

Maps a stream like StreamExt::map but flattens nested Streams. Read more
source§

fn scan<S, B, Fut, F>(self, initial_state: S, f: F) -> Scan<Self, S, Fut, F>
where F: FnMut(&mut S, Self::Item) -> Fut, Fut: Future<Output = Option<B>>, Self: Sized,

Combinator similar to StreamExt::fold that holds internal state and produces a new stream. Read more
source§

fn skip_while<Fut, F>(self, f: F) -> SkipWhile<Self, Fut, F>
where F: FnMut(&Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Skip elements on this stream while the provided asynchronous predicate resolves to true. Read more
source§

fn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F>
where F: FnMut(&Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Take elements from this stream while the provided asynchronous predicate resolves to true. Read more
source§

fn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut>
where Fut: Future, Self: Sized,

Take elements from this stream until the provided future resolves. Read more
source§

fn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F>
where F: FnMut(Self::Item) -> Fut, Fut: Future<Output = ()>, Self: Sized,

Runs this stream to completion, executing the provided asynchronous closure for each element on the stream. Read more
source§

fn take(self, n: usize) -> Take<Self>
where Self: Sized,

Creates a new stream of at most n items of the underlying stream. Read more
source§

fn skip(self, n: usize) -> Skip<Self>
where Self: Sized,

Creates a new stream which skips n items of the underlying stream. Read more
source§

fn fuse(self) -> Fuse<Self>
where Self: Sized,

Fuse a stream such that poll_next will never again be called once it has finished. This method can be used to turn any Stream into a FusedStream. Read more
source§

fn by_ref(&mut self) -> &mut Self

Borrows a stream, rather than consuming it. Read more
source§

fn zip<St>(self, other: St) -> Zip<Self, St>
where St: Stream, Self: Sized,

An adapter for zipping two streams together. Read more
source§

fn chain<St>(self, other: St) -> Chain<Self, St>
where St: Stream<Item = Self::Item>, Self: Sized,

Adapter for chaining two streams. Read more
source§

fn peekable(self) -> Peekable<Self>
where Self: Sized,

Creates a new stream which exposes a peek method. Read more
source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where F: FnMut(&Self::Item), Self: Sized,

Do something with each item of this stream, afterwards passing it on. Read more
source§

fn left_stream<B>(self) -> Either<Self, B>
where B: Stream<Item = Self::Item>, Self: Sized,

Wrap this stream in an Either stream, making it the left-hand variant of that Either. Read more
source§

fn right_stream<B>(self) -> Either<B, Self>
where B: Stream<Item = Self::Item>, Self: Sized,

Wrap this stream in an Either stream, making it the right-hand variant of that Either. Read more
source§

fn poll_next_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Option<Self::Item>>
where Self: Unpin,

A convenience method for calling Stream::poll_next on Unpin stream types.
source§

fn select_next_some(&mut self) -> SelectNextSome<'_, Self>
where Self: Unpin + FusedStream,

Returns a Future that resolves when the next item in this stream is ready. Read more
source§

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

§

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>,

§

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.