#![cfg_attr(not(ci_arti_stable), allow(renamed_and_removed_lints))]
#![cfg_attr(not(ci_arti_nightly), allow(unknown_lints))]
#![deny(missing_docs)]
#![warn(noop_method_call)]
#![deny(unreachable_pub)]
#![warn(clippy::all)]
#![deny(clippy::await_holding_lock)]
#![deny(clippy::cargo_common_metadata)]
#![deny(clippy::cast_lossless)]
#![deny(clippy::checked_conversions)]
#![warn(clippy::cognitive_complexity)]
#![deny(clippy::debug_assert_with_mut_call)]
#![deny(clippy::exhaustive_enums)]
#![deny(clippy::exhaustive_structs)]
#![deny(clippy::expl_impl_clone_on_copy)]
#![deny(clippy::fallible_impl_from)]
#![deny(clippy::implicit_clone)]
#![deny(clippy::large_stack_arrays)]
#![warn(clippy::manual_ok_or)]
#![deny(clippy::missing_docs_in_private_items)]
#![deny(clippy::missing_panics_doc)]
#![warn(clippy::needless_borrow)]
#![warn(clippy::needless_pass_by_value)]
#![warn(clippy::option_option)]
#![warn(clippy::rc_buffer)]
#![deny(clippy::ref_option_ref)]
#![warn(clippy::semicolon_if_nothing_returned)]
#![warn(clippy::trait_duplication_in_bounds)]
#![deny(clippy::unnecessary_wraps)]
#![warn(clippy::unseparated_literal_suffix)]
#![deny(clippy::unwrap_used)]
#![allow(clippy::let_unit_value)] #![allow(clippy::significant_drop_in_scrutinee)]
use derive_more::Display;
mod internal;
pub use internal::*;
mod report;
pub use report::*;
mod retriable;
pub use retriable::*;
mod truncated;
pub use truncated::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Display)]
#[non_exhaustive]
pub enum ErrorKind {
#[display(fmt = "error connecting to Tor")]
TorAccessFailed,
#[display(fmt = "attempted to use unbootstrapped client")]
BootstrapRequired,
#[display(fmt = "network directory is expired.")]
DirectoryExpired,
#[display(fmt = "could not read/write persistent state")]
PersistentStateAccessFailed,
#[display(fmt = "problem with filesystem permissions")]
FsPermissions,
#[display(fmt = "corrupted data in persistent state")]
PersistentStateCorrupted,
#[display(fmt = "corrupted data in cache")]
CacheCorrupted,
#[display(fmt = "cache access problem")]
CacheAccessFailed,
#[display(fmt = "reactor is shutting down")]
ReactorShuttingDown,
#[display(fmt = "Tor client is shutting down.")]
ArtiShuttingDown,
#[display(fmt = "operation timed out at exit")]
RemoteNetworkTimeout,
#[display(fmt = "invalid configuration")]
InvalidConfig,
#[display(fmt = "invalid configuration transition")]
InvalidConfigTransition,
#[display(fmt = "could not find a home directory")]
NoHomeDirectory,
#[display(fmt = "operation not implemented")]
NotImplemented,
#[display(fmt = "operation not supported because Arti feature disabled")]
FeatureDisabled,
#[display(fmt = "local protocol violation (local bug or incompatibility)")]
LocalProtocolViolation,
#[display(fmt = "Tor network protocol violation (bug, incompatibility, or attack)")]
TorProtocolViolation,
#[display(fmt = "problem with network or connection")]
LocalNetworkError,
#[display(fmt = "identity mismatch")]
RelayIdMismatch,
#[display(fmt = "circuit collapsed")]
CircuitCollapse,
#[display(fmt = "tor operation timed out")]
TorNetworkTimeout,
#[display(fmt = "directory fetch attempt failed")]
TorDirectoryError,
#[display(fmt = "remote stream closed")]
RemoteStreamClosed,
#[display(fmt = "remote stream reset")]
RemoteStreamReset,
#[display(fmt = "remote stream error")]
RemoteStreamError,
#[display(fmt = "remote host refused connection")]
RemoteConnectionRefused,
#[display(fmt = "rejected by exit policy")]
ExitPolicyRejected,
#[display(fmt = "timeout at exit relay")]
ExitTimeout,
#[display(fmt = "network failure at exit")]
RemoteNetworkFailed,
#[display(fmt = "remote hostname not found")]
RemoteHostNotFound,
#[display(fmt = "remote hostname lookup failure")]
RemoteHostResolutionFailed,
#[display(fmt = "remote protocol failed")]
RemoteProtocolFailed,
#[display(fmt = "relay too busy")]
RelayTooBusy,
#[display(fmt = "target address was invalid")]
InvalidStreamTarget,
#[display(fmt = "target address disabled locally")]
ForbiddenStreamTarget,
#[display(fmt = "un-retried transient failure")]
TransientFailure,
#[display(fmt = "bad API usage (bug)")]
BadApiUsage,
#[display(fmt = "remote host refused our request")]
CircuitRefused,
#[display(fmt = "could not construct a path")]
NoPath,
#[display(fmt = "no exit available for path")]
NoExit,
#[display(fmt = "possible clock skew detected")]
ClockSkew,
#[display(fmt = "internal error (bug)")]
Internal,
#[display(fmt = "unclassified error")]
Other,
}
pub trait HasKind {
fn kind(&self) -> ErrorKind;
}
impl HasKind for futures::task::SpawnError {
fn kind(&self) -> ErrorKind {
use ErrorKind as EK;
if self.is_shutdown() {
EK::ReactorShuttingDown
} else {
EK::Internal
}
}
}