blob: df1704775df2accae50b3862232283e6682c833c [file] [log] [blame]
// Copyright 2025 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use std::future::Future;
use bt_common::{
core::{Address, AddressType},
PeerId,
};
use crate::types::*;
/// Takes a peer address and queries an underlying service for its actual
/// bluetooth address and address type. Used for adding broadcast sources.
pub trait GetPeerAddr {
/// Resolve peer ID to peer address and address type.
fn get_peer_address(
&self,
peer_id: PeerId,
) -> impl Future<Output = Result<(Address, AddressType)>>;
}
/// Helper for when the peer's address is known. Always returns the given
/// address, if any.
pub struct StaticPeerAddr {
peer_id: Option<PeerId>,
address: Address,
address_type: AddressType,
}
impl StaticPeerAddr {
/// Returns a [`StaticPeerAddr`] that always returns the given address,
/// regardless of the `peer_id` being looked up.
pub fn new(address: Address, address_type: AddressType) -> Self {
Self { peer_id: None, address, address_type }
}
/// Returns a [`StaticPeerAddr`] that will only return successfully if the
/// `peer_id` matches.
pub fn new_for_peer(peer_id: PeerId, address: Address, address_type: AddressType) -> Self {
Self { peer_id: Some(peer_id), address, address_type }
}
}
impl GetPeerAddr for StaticPeerAddr {
async fn get_peer_address(&self, peer_id: PeerId) -> Result<(Address, AddressType)> {
if let Some(validated_peer_id) = self.peer_id {
if peer_id != validated_peer_id {
return Err(Error::PeerNotRecognized(peer_id));
}
}
return Ok((self.address, self.address_type));
}
}