use std::fmt::{Display, Formatter};
use super::error::ConnectionError;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ActiveConnectionState {
Unknown,
Activating,
Activated,
Deactivating,
Deactivated,
Other(u32),
}
impl From<u32> for ActiveConnectionState {
fn from(code: u32) -> Self {
match code {
0 => Self::Unknown,
1 => Self::Activating,
2 => Self::Activated,
3 => Self::Deactivating,
4 => Self::Deactivated,
v => Self::Other(v),
}
}
}
impl Display for ActiveConnectionState {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::Unknown => write!(f, "unknown"),
Self::Activating => write!(f, "activating"),
Self::Activated => write!(f, "activated"),
Self::Deactivating => write!(f, "deactivating"),
Self::Deactivated => write!(f, "deactivated"),
Self::Other(v) => write!(f, "unknown state ({v})"),
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConnectionStateReason {
Unknown,
None,
UserDisconnected,
DeviceDisconnected,
ServiceStopped,
IpConfigInvalid,
ConnectTimeout,
ServiceStartTimeout,
ServiceStartFailed,
NoSecrets,
LoginFailed,
ConnectionRemoved,
DependencyFailed,
DeviceRealizeFailed,
DeviceRemoved,
Other(u32),
}
impl From<u32> for ConnectionStateReason {
fn from(code: u32) -> Self {
match code {
0 => Self::Unknown,
1 => Self::None,
2 => Self::UserDisconnected,
3 => Self::DeviceDisconnected,
4 => Self::ServiceStopped,
5 => Self::IpConfigInvalid,
6 => Self::ConnectTimeout,
7 => Self::ServiceStartTimeout,
8 => Self::ServiceStartFailed,
9 => Self::NoSecrets,
10 => Self::LoginFailed,
11 => Self::ConnectionRemoved,
12 => Self::DependencyFailed,
13 => Self::DeviceRealizeFailed,
14 => Self::DeviceRemoved,
v => Self::Other(v),
}
}
}
impl Display for ConnectionStateReason {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::Unknown => write!(f, "unknown"),
Self::None => write!(f, "none"),
Self::UserDisconnected => write!(f, "user disconnected"),
Self::DeviceDisconnected => write!(f, "device disconnected"),
Self::ServiceStopped => write!(f, "service stopped"),
Self::IpConfigInvalid => write!(f, "IP configuration invalid"),
Self::ConnectTimeout => write!(f, "connection timed out"),
Self::ServiceStartTimeout => write!(f, "service start timed out"),
Self::ServiceStartFailed => write!(f, "service start failed"),
Self::NoSecrets => write!(f, "no secrets (password) provided"),
Self::LoginFailed => write!(f, "login/authentication failed"),
Self::ConnectionRemoved => write!(f, "connection was removed"),
Self::DependencyFailed => write!(f, "dependency failed"),
Self::DeviceRealizeFailed => write!(f, "device realization failed"),
Self::DeviceRemoved => write!(f, "device was removed"),
Self::Other(v) => write!(f, "unknown reason ({v})"),
}
}
}
#[must_use]
pub fn connection_state_reason_to_error(code: u32) -> ConnectionError {
let reason = ConnectionStateReason::from(code);
match reason {
ConnectionStateReason::NoSecrets | ConnectionStateReason::LoginFailed => {
ConnectionError::AuthFailed
}
ConnectionStateReason::ConnectTimeout | ConnectionStateReason::ServiceStartTimeout => {
ConnectionError::Timeout
}
ConnectionStateReason::IpConfigInvalid => ConnectionError::DhcpFailed,
_ => ConnectionError::ActivationFailed(reason),
}
}