rust/bt-broadcast-assistant: Fix EventStream Make EventStream have a type parameter that implements bt_gatt::GattTypes so that we can be more flexible with the trait bounds of GattTypes associated types when we implement and use the on platform-side. Change-Id: I6a95c05f3471f5d3be9860f56944f5affb72aecc Reviewed-on: https://bluetooth-review.git.corp.google.com/c/bluetooth/+/1800 Reviewed-by: Marie Janssen <jamuraa@google.com>
diff --git a/rust/bt-broadcast-assistant/src/assistant.rs b/rust/bt-broadcast-assistant/src/assistant.rs index 19102c7..2297dba 100644 --- a/rust/bt-broadcast-assistant/src/assistant.rs +++ b/rust/bt-broadcast-assistant/src/assistant.rs
@@ -108,10 +108,7 @@ // Creates a broadcast assistant and sets it up to be ready // for broadcast source scanning. Clients must use the `start` // method to poll the event stream for scan results. - pub fn new(central: T::Central) -> Self - where - <T as bt_gatt::GattTypes>::ScanResultStream: std::marker::Send, - { + pub fn new(central: T::Central) -> Self { let scan_result_stream = central.scan(&Self::scan_filters()); Self { central, @@ -132,14 +129,11 @@ /// Start broadcast assistant. Returns EventStream that the upper layer can /// poll. Upper layer can call methods on BroadcastAssistant based on the /// events it sees. - pub fn start(&mut self) -> Result<EventStream, Error> - where - <T as bt_gatt::GattTypes>::ScanResultStream: std::marker::Send, - { + pub fn start(&mut self) -> Result<EventStream<T>, Error> { if self.scan_stream.is_none() { return Err(Error::AlreadyStarted); } - Ok(EventStream::new(self.scan_stream.take().unwrap(), self.broadcast_sources.clone())) + Ok(EventStream::<T>::new(self.scan_stream.take().unwrap(), self.broadcast_sources.clone())) } pub fn scan_for_scan_delegators(&mut self) -> T::ScanResultStream {
diff --git a/rust/bt-broadcast-assistant/src/assistant/event.rs b/rust/bt-broadcast-assistant/src/assistant/event.rs index 4990e9c..3f781f6 100644 --- a/rust/bt-broadcast-assistant/src/assistant/event.rs +++ b/rust/bt-broadcast-assistant/src/assistant/event.rs
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +use core::pin::Pin; use futures::stream::{FusedStream, Stream, StreamExt}; use std::sync::Arc; use std::task::Poll; @@ -11,7 +12,6 @@ use bt_common::packet_encoding::Error as PacketError; use bt_common::PeerId; use bt_gatt::central::{AdvertisingDatum, ScanResult}; -use core::pin::Pin; use crate::assistant::{ DiscoveredBroadcastSources, Error, BASIC_AUDIO_ANNOUNCEMENT_SERVICE, @@ -28,17 +28,16 @@ /// A stream of discovered broadcast sources. /// This stream polls the scan results from GATT client to discover /// available broadcast sources. -pub struct EventStream { - // Central scan result stream for finding broadcast sources. - scan_result_stream: Pin<Box<dyn Stream<Item = Result<ScanResult, bt_gatt::types::Error>>>>, +pub struct EventStream<T: bt_gatt::GattTypes> { + scan_result_stream: Pin<Box<<T as bt_gatt::GattTypes>::ScanResultStream>>, terminated: bool, broadcast_sources: Arc<DiscoveredBroadcastSources>, } -impl EventStream { +impl<T: bt_gatt::GattTypes> EventStream<T> { pub(crate) fn new( - scan_result_stream: impl Stream<Item = Result<ScanResult, bt_gatt::types::Error>> + 'static, + scan_result_stream: T::ScanResultStream, broadcast_sources: Arc<DiscoveredBroadcastSources>, ) -> Self { Self { @@ -72,13 +71,13 @@ } } -impl FusedStream for EventStream { +impl<T: bt_gatt::GattTypes> FusedStream for EventStream<T> { fn is_terminated(&self) -> bool { self.terminated } } -impl Stream for EventStream { +impl<T: bt_gatt::GattTypes> Stream for EventStream<T> { type Item = Result<Event, Error>; fn poll_next( @@ -137,16 +136,16 @@ use bt_common::core::{AddressType, AdvertisingSetId}; use bt_gatt::central::{AdvertisingDatum, PeerName}; - use bt_gatt::test_utils::ScannedResultStream; + use bt_gatt::test_utils::{FakeTypes, ScannedResultStream}; use bt_gatt::types::Error as BtGattError; use bt_gatt::types::GattError; - fn setup_stream() -> (EventStream, ScannedResultStream) { + fn setup_stream() -> (EventStream<FakeTypes>, ScannedResultStream) { let fake_scan_result_stream = ScannedResultStream::new(); let broadcast_sources = DiscoveredBroadcastSources::new(); ( - EventStream::new(fake_scan_result_stream.clone(), broadcast_sources), + EventStream::<FakeTypes>::new(fake_scan_result_stream.clone(), broadcast_sources), fake_scan_result_stream, ) }