use thiserror::Error;
use crate::validation::ValidationError;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum RvcsiError {
#[error("adapter '{kind}' failed: {message}")]
Adapter {
kind: String,
message: String,
},
#[error("parse error at offset {offset}: {message}")]
Parse {
offset: usize,
message: String,
},
#[error("frame rejected: {0}")]
Validation(#[from] ValidationError),
#[error("invalid configuration: {0}")]
Config(String),
#[error("io error: {0}")]
Io(#[from] std::io::Error),
#[error("serde error: {0}")]
Serde(#[from] serde_json::Error),
#[error("unsupported: {0}")]
Unsupported(String),
}
impl RvcsiError {
pub fn adapter(kind: impl Into<String>, message: impl Into<String>) -> Self {
RvcsiError::Adapter {
kind: kind.into(),
message: message.into(),
}
}
pub fn parse(offset: usize, message: impl Into<String>) -> Self {
RvcsiError::Parse {
offset,
message: message.into(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_messages_are_useful() {
let e = RvcsiError::adapter("nexmon", "device /dev/wlan0 not in monitor mode");
assert!(e.to_string().contains("nexmon"));
assert!(e.to_string().contains("monitor mode"));
let e = RvcsiError::parse(12, "frame length 0");
assert!(e.to_string().contains("offset 12"));
}
}