networkmanager 0.5.0

Bindings for the Linux NetworkManager
Documentation
mod any;
mod bridge;
mod bt;
mod generic;
mod veth;
mod wired;
mod wireless;

pub use self::any::Any;
pub use self::bridge::Bridge;
pub use self::bt::Bluetooth;
pub use self::generic::Generic;
pub use self::veth::Veth;
pub use self::wired::Wired;
pub use self::wireless::Wireless;
use crate::dbus_api::DBusAccessor;
use crate::errors::Error;
use crate::gen::OrgFreedesktopNetworkManagerDevice;
use crate::types::DeviceType;
use num_traits::FromPrimitive;

pub enum Device<'a> {
    WiFi(WiFiDevice<'a>),
    Bluetooth(BluetoothDevice<'a>),
    Ethernet(EthernetDevice<'a>),
    Generic(GenericDevice<'a>),
    Bridge(BridgeDevice<'a>),
    Veth(VethDevice<'a>),
    UnsupportedDevice,
}

pub struct GenericDevice<'a> {
    dbus_accessor: DBusAccessor<'a>,
}

pub struct WiFiDevice<'a> {
    dbus_accessor: DBusAccessor<'a>,
}

pub struct BluetoothDevice<'a> {
    dbus_accessor: DBusAccessor<'a>,
}

pub struct EthernetDevice<'a> {
    dbus_accessor: DBusAccessor<'a>,
}

pub struct BridgeDevice<'a> {
    dbus_accessor: DBusAccessor<'a>,
}

pub struct VethDevice<'a> {
    dbus_accessor: DBusAccessor<'a>,
}

impl<'a> Device<'a> {
    pub(crate) fn new(dbus_accessor: DBusAccessor<'a>) -> Result<Self, Error> {
        let dev_type = dbus_accessor.create_proxy().device_type()?;
        match FromPrimitive::from_u32(dev_type) {
            Some(x) => match x {
                DeviceType::Wifi => Ok(Device::WiFi(WiFiDevice { dbus_accessor })),
                DeviceType::Bt => Ok(Device::Bluetooth(BluetoothDevice { dbus_accessor })),
                DeviceType::Ethernet => Ok(Device::Ethernet(EthernetDevice { dbus_accessor })),
                DeviceType::Generic => Ok(Device::Generic(GenericDevice { dbus_accessor })),
                DeviceType::Bridge => Ok(Device::Bridge(BridgeDevice { dbus_accessor })),
                DeviceType::Veth => Ok(Device::Veth(VethDevice { dbus_accessor })),
                _ => Ok(Device::UnsupportedDevice),
            },
            None => Err(Error::UnsupportedType),
        }
    }
}