use thiserror::Error;
use super::response::ResponseLine;
#[derive(Debug, Error)]
pub enum ControlEventError {
#[error("Received an empty response")]
EmptyResponse,
#[error("Received invalid event data")]
InvalidEventData,
}
#[derive(Debug, Clone)]
pub enum TorControlEvent {
NetworkLivenessUp,
NetworkLivenessDown,
TorControlDisconnected,
Unsupported(String),
}
impl TorControlEvent {
pub fn try_from_response(resp: &ResponseLine) -> Result<Self, ControlEventError> {
debug_assert!(resp.is_event());
let mut parts = resp.value.splitn(2, ' ');
let event_type = parts.next().ok_or(ControlEventError::EmptyResponse)?;
match event_type {
"NETWORK_LIVENESS" => {
let up_or_down = parts.next().ok_or(ControlEventError::InvalidEventData)?;
match up_or_down.trim() {
"UP" => Ok(TorControlEvent::NetworkLivenessUp),
"DOWN" => Ok(TorControlEvent::NetworkLivenessDown),
_ => Err(ControlEventError::InvalidEventData),
}
},
s => Ok(TorControlEvent::Unsupported(s.to_owned())),
}
}
}