Skip to main content

sonos_state/
error.rs

1//! Error types for sonos-state
2
3use std::fmt;
4
5/// Result type for sonos-state operations
6pub type Result<T> = std::result::Result<T, StateError>;
7
8/// Errors that can occur during state management
9#[derive(Debug)]
10pub enum StateError {
11    /// Error during initialization
12    Init(String),
13
14    /// Error parsing data
15    Parse(String),
16
17    /// Error from sonos-api
18    Api(sonos_api::ApiError),
19
20    /// State manager is already running
21    AlreadyRunning,
22
23    /// Shutdown failed
24    ShutdownFailed,
25
26    /// Lock acquisition failed
27    LockError(String),
28
29    /// Speaker not found
30    SpeakerNotFound(crate::model::SpeakerId),
31
32    /// Invalid URL
33    InvalidUrl(String),
34
35    /// Initialization failed
36    InitializationFailed(String),
37
38    /// Device registration failed
39    DeviceRegistrationFailed(String),
40
41    /// Subscription failed
42    SubscriptionFailed(String),
43
44    /// Invalid IP address
45    InvalidIpAddress(String),
46
47    /// Lock poisoned (internal mutex error)
48    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}