pub type Result<T> = std::result::Result<T, StateError>;
#[derive(Debug, thiserror::Error)]
pub enum StateError {
#[error("Initialization error: {0}")]
Init(String),
#[error("Parse error: {0}")]
Parse(String),
#[error("API error: {0}")]
Api(#[from] sonos_api::ApiError),
#[error("State manager is already running")]
AlreadyRunning,
#[error("Shutdown failed")]
ShutdownFailed,
#[error("Lock error: {0}")]
LockError(String),
#[error("Speaker not found: {0:?}")]
SpeakerNotFound(crate::model::SpeakerId),
#[error("Invalid URL: {0}")]
InvalidUrl(String),
#[error("Initialization failed: {0}")]
InitializationFailed(String),
#[error("Device registration failed: {0}")]
DeviceRegistrationFailed(String),
#[error("Subscription failed: {0}")]
SubscriptionFailed(String),
#[error("Invalid IP address: {0}")]
InvalidIpAddress(String),
#[error("Internal lock poisoned")]
LockPoisoned,
}
#[cfg(test)]
mod tests {
use super::*;
use std::error::Error as _;
#[test]
fn api_variant_keeps_message_and_source() {
let err = StateError::from(sonos_api::ApiError::NetworkError("boom".to_string()));
assert_eq!(err.to_string(), "API error: Network error: boom");
assert!(err.source().is_some());
}
}