use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ModelError {
#[error("invalid /accessories or /characteristics JSON: {0}")]
Json(#[from] serde_json::Error),
#[error("unknown characteristic format {0:?}")]
UnknownFormat(String),
#[error("malformed type UUID {0:?}")]
MalformedUuid(String),
#[error("value type mismatch for format {format}: {detail}")]
ValueType {
format: &'static str,
detail: String,
},
#[error("value {value} out of range for format {format}")]
ValueRange {
format: &'static str,
value: String,
},
#[error("invalid base64 in tlv8/data value: {0}")]
Base64(String),
#[error("characteristic {aid}.{iid} returned HAP status {status}")]
CharacteristicStatus {
aid: u64,
iid: u64,
status: i64,
},
#[error("request execution failed: {0}")]
Executor(String),
}
impl ModelError {
#[must_use]
pub fn hap_status(&self) -> Option<crate::status::HapStatus> {
match self {
ModelError::CharacteristicStatus { status, .. } => {
Some(crate::status::HapStatus::from_code(*status))
}
_ => None,
}
}
}
pub type Result<T> = core::result::Result<T, ModelError>;