use crate::method::TraversalKind;
pub mod rpc_error_codes {
pub const RESOURCE_UNAVAILABLE: i32 = -32004;
pub const PEER_UNREACHABLE: i32 = -32006;
pub const RANGE_NOT_SATISFIABLE: i32 = -32007;
}
#[derive(Debug, thiserror::Error)]
pub enum NatError {
#[error("all NAT traversal methods failed: {0:?}")]
AllMethodsFailed(Vec<MethodError>),
#[error("no traversal methods enabled")]
NoMethodsEnabled,
#[error("peer identity mismatch: expected {expected}, got {actual}")]
PeerIdentityMismatch {
expected: String,
actual: String,
},
#[error("invalid configuration: {0}")]
InvalidConfig(String),
}
impl NatError {
pub fn rpc_error_code(&self) -> i32 {
rpc_error_codes::PEER_UNREACHABLE
}
}
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
#[error("{kind:?}: {reason}")]
pub struct MethodError {
pub kind: TraversalKind,
pub reason: String,
pub timeout: bool,
}
impl MethodError {
pub fn failed(kind: TraversalKind, reason: impl Into<String>) -> Self {
MethodError {
kind,
reason: reason.into(),
timeout: false,
}
}
pub fn timeout(kind: TraversalKind) -> Self {
MethodError {
kind,
reason: format!("{kind:?} timed out"),
timeout: true,
}
}
}