nm-wifi 0.2.0

A Terminal User Interface for managing Wi-Fi connections on Linux
Documentation
use std::{error::Error, future::Future, pin::Pin};

use crate::{network::ConnectionRequest, wifi::WifiNetwork};

pub type BackendFuture<'a, T> = Pin<Box<dyn Future<Output = T> + 'a>>;

pub trait NetworkBackend {
    fn connected_ssid(&self) -> Result<Option<String>, Box<dyn Error>>;
    fn adapter_name(&self) -> Result<Option<String>, Box<dyn Error>>;
    fn scan_networks(
        &self,
    ) -> BackendFuture<'_, Result<Vec<WifiNetwork>, Box<dyn Error>>>;
    fn connect(
        &self,
        request: ConnectionRequest<'_>,
    ) -> Result<(), Box<dyn Error>>;
    fn disconnect(&self, network: &WifiNetwork) -> Result<(), Box<dyn Error>>;
}

#[cfg(feature = "demo")]
#[derive(Debug, Default, Clone, Copy)]
pub struct DemoNetworkBackend;

#[cfg(feature = "demo")]
impl NetworkBackend for DemoNetworkBackend {
    fn connected_ssid(&self) -> Result<Option<String>, Box<dyn Error>> {
        crate::network::demo::get_connected_ssid()
    }

    fn adapter_name(&self) -> Result<Option<String>, Box<dyn Error>> {
        crate::network::demo::get_wifi_adapter_name()
    }

    fn scan_networks(
        &self,
    ) -> BackendFuture<'_, Result<Vec<WifiNetwork>, Box<dyn Error>>> {
        Box::pin(crate::network::demo::scan_wifi_networks())
    }

    fn connect(
        &self,
        request: ConnectionRequest<'_>,
    ) -> Result<(), Box<dyn Error>> {
        crate::network::demo::connect_to_network(request)
    }

    fn disconnect(&self, network: &WifiNetwork) -> Result<(), Box<dyn Error>> {
        crate::network::demo::disconnect_from_network(network)
    }
}

#[cfg(not(feature = "demo"))]
#[derive(Debug, Default, Clone, Copy)]
pub struct NetworkManagerBackend;

#[cfg(not(feature = "demo"))]
impl NetworkBackend for NetworkManagerBackend {
    fn connected_ssid(&self) -> Result<Option<String>, Box<dyn Error>> {
        crate::network::networkmanager::get_connected_ssid()
    }

    fn adapter_name(&self) -> Result<Option<String>, Box<dyn Error>> {
        crate::network::networkmanager::get_wifi_adapter_name()
    }

    fn scan_networks(
        &self,
    ) -> BackendFuture<'_, Result<Vec<WifiNetwork>, Box<dyn Error>>> {
        Box::pin(crate::network::networkmanager::scan_wifi_networks())
    }

    fn connect(
        &self,
        request: ConnectionRequest<'_>,
    ) -> Result<(), Box<dyn Error>> {
        crate::network::networkmanager::connect_to_network(request)
    }

    fn disconnect(&self, network: &WifiNetwork) -> Result<(), Box<dyn Error>> {
        crate::network::networkmanager::disconnect_from_network(network)
    }
}

#[cfg(feature = "demo")]
pub fn default_backend() -> Box<dyn NetworkBackend> {
    Box::new(DemoNetworkBackend)
}

#[cfg(not(feature = "demo"))]
pub fn default_backend() -> Box<dyn NetworkBackend> {
    Box::new(NetworkManagerBackend)
}