use thiserror::Error;
use super::connection_state::ConnectionStateReason;
use super::state_reason::StateReason;
#[non_exhaustive]
#[derive(Debug, Error)]
pub enum ConnectionError {
#[error("D-Bus error: {0}")]
Dbus(#[from] zbus::Error),
#[error("network not found")]
NotFound,
#[error("authentication failed")]
AuthFailed,
#[error("supplicant configuration failed")]
SupplicantConfigFailed,
#[error("supplicant timeout")]
SupplicantTimeout,
#[error("DHCP failed")]
DhcpFailed,
#[error("connection timeout")]
Timeout,
#[error("connection stuck in state: {0}")]
Stuck(String),
#[error("no Wi-Fi device found")]
NoWifiDevice,
#[error("no wired device was found")]
NoWiredDevice,
#[error("Wi-Fi device not ready")]
WifiNotReady,
#[error("no saved connection for network")]
NoSavedConnection,
#[error("no password was provided")]
MissingPassword,
#[error("connection failed: {0}")]
DeviceFailed(StateReason),
#[error("connection activation failed: {0}")]
ActivationFailed(ConnectionStateReason),
#[error("invalid UTF-8 in SSID: {0}")]
InvalidUtf8(#[from] std::str::Utf8Error),
#[error("no VPN connection found")]
NoVpnConnection,
#[error("invalid address: {0}")]
InvalidAddress(String),
#[error("invalid peer configuration: {0}")]
InvalidPeers(String),
#[error("invalid WireGuard private key: {0}")]
InvalidPrivateKey(String),
#[error("invalid WireGuard public key: {0}")]
InvalidPublicKey(String),
#[error("invalid VPN gateway: {0}")]
InvalidGateway(String),
#[error("VPN connection failed: {0}")]
VpnFailed(String),
#[error("Bluetooth device not found")]
NoBluetoothDevice,
#[error("{context}: {source}")]
DbusOperation {
context: String,
#[source]
source: zbus::Error,
},
}