1use std::fmt;
4
5pub type Result<T> = std::result::Result<T, StateError>;
7
8#[derive(Debug)]
10pub enum StateError {
11 Init(String),
13
14 Parse(String),
16
17 Api(sonos_api::ApiError),
19
20 AlreadyRunning,
22
23 ShutdownFailed,
25
26 LockError(String),
28
29 SpeakerNotFound(crate::model::SpeakerId),
31
32 InvalidUrl(String),
34
35 InitializationFailed(String),
37
38 DeviceRegistrationFailed(String),
40
41 SubscriptionFailed(String),
43
44 InvalidIpAddress(String),
46
47 LockPoisoned,
49}
50
51impl fmt::Display for StateError {
52 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
53 match self {
54 StateError::Init(msg) => write!(f, "Initialization error: {msg}"),
55 StateError::Parse(msg) => write!(f, "Parse error: {msg}"),
56 StateError::Api(err) => write!(f, "API error: {err}"),
57 StateError::AlreadyRunning => write!(f, "State manager is already running"),
58 StateError::ShutdownFailed => write!(f, "Shutdown failed"),
59 StateError::LockError(msg) => write!(f, "Lock error: {msg}"),
60 StateError::SpeakerNotFound(id) => write!(f, "Speaker not found: {id:?}"),
61 StateError::InvalidUrl(url) => write!(f, "Invalid URL: {url}"),
62 StateError::InitializationFailed(msg) => write!(f, "Initialization failed: {msg}"),
63 StateError::DeviceRegistrationFailed(msg) => {
64 write!(f, "Device registration failed: {msg}")
65 }
66 StateError::SubscriptionFailed(msg) => write!(f, "Subscription failed: {msg}"),
67 StateError::InvalidIpAddress(ip) => write!(f, "Invalid IP address: {ip}"),
68 StateError::LockPoisoned => write!(f, "Internal lock poisoned"),
69 }
70 }
71}
72
73impl std::error::Error for StateError {
74 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
75 match self {
76 StateError::Api(err) => Some(err),
77 _ => None,
78 }
79 }
80}
81
82impl From<sonos_api::ApiError> for StateError {
83 fn from(err: sonos_api::ApiError) -> Self {
84 StateError::Api(err)
85 }
86}