use enum_primitive_derive::Primitive;
use thiserror::Error;
use super::command::CommandTag;
#[derive(Error, Debug)]
pub enum ProtocolError {
#[error("unsupported protocol version: {0}")]
UnsupportedVersion(u16),
#[error("unexpected command: {0:?}")]
UnexpectedCommand(CommandTag),
#[error("invalid IPC message: {0}")]
Invalid(String),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("unimplemented command: {1:?}")]
Unimplemented(u32, CommandTag),
#[error("server error: {0:?}")]
ServerError(PulseError),
#[error("timeout received from server")]
Timeout,
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Primitive)]
pub enum PulseError {
AccessDenied = 1,
Command = 2,
Invalid = 3,
Exist = 4,
NoEntity = 5,
ConnectionRefused = 6,
Protocol = 7,
Timeout = 8,
AuthKey = 9,
Internal = 10,
ConnectionTerminated = 11,
Killed = 12,
InvalidServer = 13,
ModInitFailed = 14,
BadState = 15,
NoData = 16,
Version = 17,
TooLarge = 18,
NotSupported = 19,
Unknown = 20,
NoExtension = 21,
Obsolete = 22,
NotImplemented = 23,
Forked = 24,
Io = 25,
Busy = 26,
}
impl std::fmt::Display for PulseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PulseError::AccessDenied => write!(f, "Access failure"),
PulseError::Command => write!(f, "Unknown command"),
PulseError::Invalid => write!(f, "Invalid argument"),
PulseError::Exist => write!(f, "Entity exists"),
PulseError::NoEntity => write!(f, "No such entity"),
PulseError::ConnectionRefused => write!(f, "Connection refused"),
PulseError::Protocol => write!(f, "Protocol error"),
PulseError::Timeout => write!(f, "Timeout"),
PulseError::AuthKey => write!(f, "No authentication key"),
PulseError::Internal => write!(f, "Internal error"),
PulseError::ConnectionTerminated => write!(f, "Connection terminated"),
PulseError::Killed => write!(f, "Entity killed"),
PulseError::InvalidServer => write!(f, "Invalid server"),
PulseError::ModInitFailed => write!(f, "Module initialization failed"),
PulseError::BadState => write!(f, "Bad state"),
PulseError::NoData => write!(f, "No data"),
PulseError::Version => write!(f, "Incompatible protocol version"),
PulseError::TooLarge => write!(f, "Data too large"),
PulseError::NotSupported => write!(f, "Operation not supported"),
PulseError::Unknown => write!(f, "The error code was unknown to the client"),
PulseError::NoExtension => write!(f, "Extension does not exist"),
PulseError::Obsolete => write!(f, "Obsolete functionality"),
PulseError::NotImplemented => write!(f, "Missing implementation"),
PulseError::Forked => write!(f, "Caller tried to reuse the context"),
PulseError::Io => write!(f, "An IO error occurred"),
PulseError::Busy => write!(f, "Device or resource busy"),
}
}
}