use thiserror::Error;
use crate::core::ovpn_parser::error::OvpnParseError;
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("saved connection '{0}' not found")]
SavedConnectionNotFound(String),
#[error("saved connection malformed: {0}")]
MalformedSavedConnection(String),
#[error("incomplete builder: {0}")]
IncompleteBuilder(String),
#[error("connectivity checks are disabled in NetworkManager")]
ConnectivityCheckDisabled,
#[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("VPN connection '{0}' not found")]
VpnNotFound(String),
#[error("multiple VPN connections named '{0}', use UUID")]
VpnIdAmbiguous(String),
#[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,
},
#[error("secret agent registration failed: {context}")]
AgentRegistration {
context: String,
},
#[error("secret agent not registered")]
AgentNotRegistered,
#[error("secret agent already registered under this identifier")]
AgentAlreadyRegistered,
#[error("error while parsing a configuration: {0}")]
ParseError(OvpnParseError),
#[error("access point for SSID '{ssid}' with BSSID '{bssid}' not found")]
ApBssidNotFound {
ssid: String,
bssid: String,
},
#[error("invalid BSSID format: '{0}' (expected XX:XX:XX:XX:XX:XX)")]
InvalidBssid(String),
#[error("interface '{interface}' is not a Wi-Fi device")]
NotAWifiDevice {
interface: String,
},
#[error("no Wi-Fi device named '{interface}'")]
WifiInterfaceNotFound {
interface: String,
},
#[error("radio is hardware-disabled (rfkill)")]
HardwareRadioKilled,
#[error("bluetooth stack unavailable: {0}")]
BluezUnavailable(String),
#[error("bluetooth toggle failed: {0}")]
BluetoothToggleFailed(String),
#[error("invalid VLAN ID {id}: must be between 1 and 4094")]
InvalidVlanId {
id: u16,
},
#[error("invalid {field}: {reason}")]
InvalidInput {
field: String,
reason: String,
},
}