use super::DeviceAddress;
use core::{iter, slice};
pub trait AddressFilter {
fn matches(&self, address: DeviceAddress) -> bool;
}
pub struct AllowAll;
impl AddressFilter for AllowAll {
fn matches(&self, _address: DeviceAddress) -> bool {
true
}
}
pub struct WhitelistFilter<I: Iterator<Item = DeviceAddress> + Clone> {
addresses: I,
}
impl<I: Iterator<Item = DeviceAddress> + Clone> WhitelistFilter<I> {
pub fn new(allowed_addresses: I) -> Self {
Self {
addresses: allowed_addresses,
}
}
}
pub type SliceIter<'a> = iter::Cloned<slice::Iter<'a, DeviceAddress>>;
impl<'a> WhitelistFilter<SliceIter<'a>> {
pub fn from_slice(addresses: &'a [DeviceAddress]) -> Self {
Self {
addresses: addresses.iter().cloned(),
}
}
}
pub type SingleIter = iter::Once<DeviceAddress>;
impl WhitelistFilter<SingleIter> {
pub fn from_address(address: DeviceAddress) -> Self {
Self {
addresses: iter::once(address),
}
}
}
impl<I: Iterator<Item = DeviceAddress> + Clone> AddressFilter for WhitelistFilter<I> {
fn matches(&self, address: DeviceAddress) -> bool {
self.addresses.clone().any(|a| a == address)
}
}
pub struct AdvFilter<S: AddressFilter, C: AddressFilter> {
scan: S,
connect: C,
}
impl<S: AddressFilter, C: AddressFilter> AdvFilter<S, C> {
pub fn new(scan: S, connect: C) -> Self {
Self { scan, connect }
}
pub fn may_scan(&self, device: DeviceAddress) -> bool {
self.scan.matches(device)
}
pub fn may_connect(&self, device: DeviceAddress) -> bool {
self.connect.matches(device)
}
}
pub struct ScanFilter<S: AddressFilter> {
scan: S,
}
impl<S: AddressFilter> ScanFilter<S> {
pub fn new(scan: S) -> Self {
Self { scan }
}
pub fn should_scan(&self, device: DeviceAddress) -> bool {
self.scan.matches(device)
}
}