tor_guardmgr/vanguards/
err.rs1use std::sync::Arc;
4
5use futures::task::SpawnError;
6use tor_error::{ErrorKind, HasKind};
7
8use crate::vanguards::{Layer, VanguardMode};
9
10#[derive(Clone, Debug, thiserror::Error)]
12#[non_exhaustive]
13pub enum VanguardMgrError {
14 #[error("Cannot {action} with unbootstrapped vanguard manager")]
17 BootstrapRequired {
18 action: &'static str,
20 },
21
22 #[error("{layer} vanguards are not supported in {mode} mode")]
24 LayerNotSupported {
25 layer: Layer,
27 mode: VanguardMode,
29 },
30
31 #[error("No suitable relays")]
33 NoSuitableRelay(Layer),
34
35 #[error("Unable to get timely network directory")]
37 NetDir(#[from] tor_netdir::Error),
38
39 #[error("Failed to access persistent vanguard state")]
41 State(#[from] tor_persist::Error),
42
43 #[error("Unable to spawn a task")]
45 Spawn(#[source] Arc<SpawnError>),
46
47 #[error("Internal error")]
49 Bug(#[from] tor_error::Bug),
50}
51
52impl HasKind for VanguardMgrError {
53 fn kind(&self) -> ErrorKind {
54 match self {
55 VanguardMgrError::BootstrapRequired { .. } => ErrorKind::BootstrapRequired,
56 VanguardMgrError::LayerNotSupported { .. } => ErrorKind::BadApiUsage,
57 VanguardMgrError::NoSuitableRelay(_) => ErrorKind::NoPath,
58 VanguardMgrError::NetDir(e) => e.kind(),
59 VanguardMgrError::State(e) => e.kind(),
60 VanguardMgrError::Spawn(e) => e.kind(),
61 VanguardMgrError::Bug(e) => e.kind(),
62 }
63 }
64}