use std::sync::Arc;
use futures::task::SpawnError;
use tor_error::{ErrorKind, HasKind};
use crate::vanguards::{Layer, VanguardMode};
#[derive(Clone, Debug, thiserror::Error)]
#[non_exhaustive]
pub enum VanguardMgrError {
#[error("Cannot {action} with unbootstrapped vanguard manager")]
BootstrapRequired {
action: &'static str,
},
#[error("{layer} vanguards are not supported in {mode} mode")]
LayerNotSupported {
layer: Layer,
mode: VanguardMode,
},
#[error("No suitable relays")]
NoSuitableRelay(Layer),
#[error("Unable to get timely network directory")]
NetDir(#[from] tor_netdir::Error),
#[error("Failed to access persistent vanguard state")]
State(#[from] tor_persist::Error),
#[error("Unable to spawn a task")]
Spawn(#[source] Arc<SpawnError>),
#[error("Internal error")]
Bug(#[from] tor_error::Bug),
}
impl HasKind for VanguardMgrError {
fn kind(&self) -> ErrorKind {
match self {
VanguardMgrError::BootstrapRequired { .. } => ErrorKind::BootstrapRequired,
VanguardMgrError::LayerNotSupported { .. } => ErrorKind::BadApiUsage,
VanguardMgrError::NoSuitableRelay(_) => ErrorKind::NoPath,
VanguardMgrError::NetDir(e) => e.kind(),
VanguardMgrError::State(e) => e.kind(),
VanguardMgrError::Spawn(e) => e.kind(),
VanguardMgrError::Bug(e) => e.kind(),
}
}
}