#![cfg_attr(docsrs, feature(doc_cfg))]
#![doc = include_str!("../README.md")]
#![allow(renamed_and_removed_lints)] #![allow(unknown_lints)] #![warn(missing_docs)]
#![warn(noop_method_call)]
#![warn(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)]
#![warn(clippy::needless_borrow)]
#![warn(clippy::needless_pass_by_value)]
#![warn(clippy::option_option)]
#![deny(clippy::print_stderr)]
#![deny(clippy::print_stdout)]
#![warn(clippy::rc_buffer)]
#![deny(clippy::ref_option_ref)]
#![warn(clippy::semicolon_if_nothing_returned)]
#![warn(clippy::trait_duplication_in_bounds)]
#![deny(clippy::unchecked_time_subtraction)]
#![deny(clippy::unnecessary_wraps)]
#![warn(clippy::unseparated_literal_suffix)]
#![deny(clippy::unwrap_used)]
#![deny(clippy::mod_module_files)]
#![allow(clippy::let_unit_value)] #![allow(clippy::uninlined_format_args)]
#![allow(clippy::significant_drop_in_scrutinee)] #![allow(clippy::result_large_err)] #![allow(clippy::needless_raw_string_hashes)] #![allow(clippy::needless_lifetimes)] #![allow(mismatched_lifetime_syntaxes)] #![allow(clippy::collapsible_if)] #![deny(clippy::unused_async)]
use derive_more::Display;
mod internal;
pub use internal::*;
mod report;
pub use report::*;
mod retriable;
pub use retriable::*;
mod misc;
pub use misc::*;
#[cfg(feature = "tracing")]
pub mod tracing;
#[cfg(feature = "http")]
mod http;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Display)]
#[non_exhaustive]
pub enum ErrorKind {
#[display("error connecting to Tor")]
TorAccessFailed,
#[display("attempted to use unbootstrapped client")]
BootstrapRequired,
#[display("network directory is expired.")]
DirectoryExpired,
#[display("could not read/write persistent state")]
PersistentStateAccessFailed,
#[display("local resource (port, lockfile, etc.) already in use")]
LocalResourceAlreadyInUse,
#[display("problem with filesystem permissions")]
FsPermissions,
#[display("corrupted data in persistent state")]
PersistentStateCorrupted,
#[display("corrupted data in cache")]
CacheCorrupted,
#[display("cache access problem")]
CacheAccessFailed,
#[display("corrupted data in keystore")]
KeystoreCorrupted,
#[display("could not access keystore")]
KeystoreAccessFailed,
#[display("reactor is shutting down")]
ReactorShuttingDown,
#[display("Tor client is shutting down.")]
ArtiShuttingDown,
#[display("Software version is deprecated")]
SoftwareDeprecated,
#[display("operation timed out at exit")]
RemoteNetworkTimeout,
#[display("invalid configuration")]
InvalidConfig,
#[display("invalid configuration transition")]
InvalidConfigTransition,
#[display("could not find a home directory")]
NoHomeDirectory,
#[display("operation not implemented")]
NotImplemented,
#[display("operation not supported because Arti feature disabled")]
FeatureDisabled,
#[display("local protocol violation (local bug or incompatibility)")]
LocalProtocolViolation,
#[display("Tor network protocol violation (bug, incompatibility, or attack)")]
TorProtocolViolation,
#[display("problem with network or connection")]
LocalNetworkError,
#[display("local resource exhausted")]
LocalResourceExhausted,
#[display("an externally launched plug-in tool failed")]
ExternalToolFailed,
#[display("identity mismatch")]
RelayIdMismatch,
#[display("circuit collapsed")]
CircuitCollapse,
#[display("tor operation timed out")]
TorNetworkTimeout,
#[display("directory fetch attempt failed")]
TorDirectoryError,
#[display("remote stream closed")]
RemoteStreamClosed,
#[display("remote stream reset")]
RemoteStreamReset,
#[display("remote stream error")]
RemoteStreamError,
#[display("remote host refused connection")]
RemoteConnectionRefused,
#[display("rejected by exit policy")]
ExitPolicyRejected,
#[display("timeout at exit relay")]
ExitTimeout,
#[display("network failure at exit")]
RemoteNetworkFailed,
#[display("remote hostname not found")]
RemoteHostNotFound,
#[display("Onion Service not found")]
OnionServiceNotFound,
#[display("Onion Service not running")]
OnionServiceNotRunning,
#[display("Onion Service protocol failed (apparently due to service behaviour)")]
OnionServiceProtocolViolation,
#[display("Onion Service not reachable (due to service, or Tor network, behaviour)")]
OnionServiceConnectionFailed,
#[display("Onion service required authentication, but none was provided.")]
OnionServiceMissingClientAuth,
#[display("Onion service required authentication, but provided authentication was incorrect.")]
OnionServiceWrongClientAuth,
#[display(".onion address was invalid.")]
OnionServiceAddressInvalid,
#[display("remote hostname lookup failure")]
RemoteHostResolutionFailed,
#[display("remote protocol violation")]
RemoteProtocolViolation,
#[display("relay too busy")]
RelayTooBusy,
#[display("target address was invalid")]
InvalidStreamTarget,
#[display("target address disabled locally")]
ForbiddenStreamTarget,
#[display("un-retried transient failure")]
TransientFailure,
#[display("bad API usage (bug)")]
BadApiUsage,
#[display("remote host refused our request")]
CircuitRefused,
#[display("could not construct a path")]
NoPath,
#[display("no exit available for path")]
NoExit,
#[display("Tor network consensus directory is not usable")]
TorDirectoryUnusable,
#[display("possible clock skew detected")]
ClockSkew,
#[display("internal error (bug)")]
Internal,
#[display("unclassified error")]
Other,
}
pub trait HasKind {
fn kind(&self) -> ErrorKind;
}
#[cfg(feature = "futures")]
impl HasKind for futures::task::SpawnError {
fn kind(&self) -> ErrorKind {
use ErrorKind as EK;
if self.is_shutdown() {
EK::ReactorShuttingDown
} else {
EK::Internal
}
}
}
impl HasKind for void::Void {
fn kind(&self) -> ErrorKind {
void::unreachable(*self)
}
}
impl HasKind for std::convert::Infallible {
fn kind(&self) -> ErrorKind {
unreachable!()
}
}
mod sealed {
pub trait Sealed {}
}