diff --git a/networkmanager/src/device.rs b/networkmanager/src/device.rs new file mode 100644 index 0000000..b43de6e --- /dev/null +++ b/networkmanager/src/device.rs @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MPL-2.0 + +pub mod bluetooth; +pub mod wired; +pub mod wireless; + +use crate::interface::device::DeviceProxy; +use std::ops::Deref; + +pub struct Device<'a>(DeviceProxy<'a>); + +impl<'a> Deref for Device<'a> { + type Target = DeviceProxy<'a>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<'a> From> for Device<'a> { + fn from(device: DeviceProxy<'a>) -> Self { + Device(device) + } +} diff --git a/networkmanager/src/device/bluetooth.rs b/networkmanager/src/device/bluetooth.rs new file mode 100644 index 0000000..a06073c --- /dev/null +++ b/networkmanager/src/device/bluetooth.rs @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MPL-2.0 + +use crate::interface::device::bluetooth::BluetoothDeviceProxy; +use std::ops::Deref; + +pub struct BluetoothDevice<'a>(BluetoothDeviceProxy<'a>); + +impl<'a> Deref for BluetoothDevice<'a> { + type Target = BluetoothDeviceProxy<'a>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} diff --git a/networkmanager/src/device/wired.rs b/networkmanager/src/device/wired.rs new file mode 100644 index 0000000..d0ff0d3 --- /dev/null +++ b/networkmanager/src/device/wired.rs @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MPL-2.0 + +use crate::interface::device::wired::WiredDeviceProxy; +use std::ops::Deref; + +pub struct WiredDevice<'a>(WiredDeviceProxy<'a>); + +impl<'a> Deref for WiredDevice<'a> { + type Target = WiredDeviceProxy<'a>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} diff --git a/networkmanager/src/device/wireless.rs b/networkmanager/src/device/wireless.rs new file mode 100644 index 0000000..c98e1dc --- /dev/null +++ b/networkmanager/src/device/wireless.rs @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MPL-2.0 + +use crate::interface::device::wireless::WirelessDeviceProxy; +use std::ops::Deref; + +pub struct WirelessDevice<'a>(WirelessDeviceProxy<'a>); + +impl<'a> Deref for WirelessDevice<'a> { + type Target = WirelessDeviceProxy<'a>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} diff --git a/networkmanager/src/interface/device/bluetooth.rs b/networkmanager/src/interface/device/bluetooth.rs index 780186b..740e9a7 100644 --- a/networkmanager/src/interface/device/bluetooth.rs +++ b/networkmanager/src/interface/device/bluetooth.rs @@ -17,7 +17,7 @@ use zbus::dbus_proxy; interface = "org.freedesktop.NetworkManager.Device.Bluetooth", default_service = "org.freedesktop.NetworkManager" )] -pub trait Bluetooth { +pub trait BluetoothDevice { /// BtCapabilities property #[dbus_proxy(property)] fn bt_capabilities(&self) -> zbus::Result; diff --git a/networkmanager/src/lib.rs b/networkmanager/src/lib.rs index 328a41c..e287220 100644 --- a/networkmanager/src/lib.rs +++ b/networkmanager/src/lib.rs @@ -1,3 +1,5 @@ // SPDX-License-Identifier: MPL-2.0 +pub mod device; pub mod interface; +pub mod nm; diff --git a/networkmanager/src/nm.rs b/networkmanager/src/nm.rs new file mode 100644 index 0000000..2697ecf --- /dev/null +++ b/networkmanager/src/nm.rs @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MPL-2.0 + +use crate::{ + device::Device, + interface::{device::DeviceProxy, NetworkManagerProxy}, +}; +use zbus::{Connection, Result}; + +pub struct NetworkManager<'a>(NetworkManagerProxy<'a>); + +impl<'a> NetworkManager<'a> { + pub async fn new(connection: &'a Connection) -> Result> { + NetworkManagerProxy::new(connection).await.map(Self) + } + + pub async fn devices(&self) -> Result>> { + let devices = self.0.get_all_devices().await?; + let mut out = Vec::with_capacity(devices.len()); + for device in devices { + let device = DeviceProxy::builder(self.0.connection()) + .path(device)? + .build() + .await?; + out.push(device.into()); + } + Ok(out) + } +}