use core::future::Future;
use rs_matter::error::Error;
use rs_matter::transport::network::btp::{AdvData, Btp};
#[cfg(all(feature = "os", target_os = "linux", feature = "bluer"))]
pub use bluer::*;
#[cfg(feature = "zbus")]
pub use bluez::*;
pub trait GattPeripheral {
async fn run(
&mut self,
btp: &Btp,
service_name: &str,
service_adv: &AdvData,
) -> Result<(), Error>;
}
impl<T> GattPeripheral for &mut T
where
T: GattPeripheral,
{
fn run(
&mut self,
btp: &Btp,
service_name: &str,
service_adv: &AdvData,
) -> impl Future<Output = Result<(), Error>> {
(*self).run(btp, service_name, service_adv)
}
}
#[cfg(all(feature = "os", target_os = "linux", feature = "bluer"))]
#[allow(clippy::large_futures)]
mod bluer {
use rs_matter::error::Error;
use rs_matter::transport::network::btp::{AdvData, Btp};
pub struct BluerGattPeripheral<'a>(Option<&'a str>);
impl<'a> BluerGattPeripheral<'a> {
pub const fn new(adapter_name: Option<&'a str>) -> Self {
Self(adapter_name)
}
}
impl super::GattPeripheral for BluerGattPeripheral<'_> {
async fn run(
&mut self,
btp: &Btp,
service_name: &str,
service_adv: &AdvData,
) -> Result<(), Error> {
rs_matter::transport::network::btp::bluer::run_peripheral(
self.0,
service_name,
service_adv,
btp,
)
.await
}
}
}
#[cfg(feature = "zbus")]
#[allow(clippy::large_futures)]
mod bluez {
use rs_matter::error::Error;
use rs_matter::transport::network::btp::{AdvData, Btp};
use rs_matter::utils::zbus::Connection;
pub struct BluezGattPeripheral<'a> {
connection: &'a Connection,
adapter_name: Option<&'a str>,
}
impl<'a> BluezGattPeripheral<'a> {
pub const fn new(connection: &'a Connection, adapter_name: Option<&'a str>) -> Self {
Self {
connection,
adapter_name,
}
}
}
impl super::GattPeripheral for BluezGattPeripheral<'_> {
async fn run(
&mut self,
btp: &Btp,
service_name: &str,
service_adv: &AdvData,
) -> Result<(), Error> {
rs_matter::transport::network::btp::bluez::run_peripheral(
self.connection,
self.adapter_name,
service_name,
service_adv,
btp,
)
.await
}
}
}