use std::net::AddrParseError;
use std::path::PathBuf;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("invalid peer address: {0}")]
InvalidPeerAddress(#[from] AddrParseError),
#[error("invalid transfer input: {0}")]
InvalidInput(String),
#[error("peer not found: {0}")]
PeerNotFound(String),
#[error("peer lookup is ambiguous: {0}")]
AmbiguousPeer(String),
#[error("peer fingerprint mismatch: expected {expected}, got {actual}")]
PeerFingerprintMismatch { expected: String, actual: String },
#[error("filesystem error at {}: {source}", path.display())]
IoPath {
path: PathBuf,
#[source]
source: std::io::Error,
},
#[error("filesystem error: {0}")]
Io(#[from] std::io::Error),
#[error("configuration directory is unavailable")]
ConfigDirUnavailable,
#[error("configuration parse failed: {0}")]
ConfigParse(String),
#[error("configuration serialization failed: {0}")]
ConfigSerialize(String),
#[error("mDNS discovery failed: {0}")]
Discovery(String),
#[error("certificate generation failed: {0}")]
CertificateGeneration(#[from] rcgen::Error),
#[error("TLS configuration failed: {0}")]
Tls(#[from] rustls::Error),
#[error("QUIC connection failed: {0}")]
Connect(#[from] quinn::ConnectError),
#[error("QUIC connection closed: {0}")]
Connection(#[from] quinn::ConnectionError),
#[error("QUIC read failed: {0}")]
Read(#[from] quinn::ReadError),
#[error("QUIC exact read failed: {0}")]
ReadExact(#[from] quinn::ReadExactError),
#[error("QUIC write failed: {0}")]
Write(#[from] quinn::WriteError),
#[error("QUIC stream is closed: {0}")]
ClosedStream(#[from] quinn::ClosedStream),
#[error("QUIC endpoint connection refused")]
NoIncomingConnection,
#[error("crypto configuration failed: {0}")]
CryptoConfig(String),
#[error("protocol error: {0}")]
Protocol(String),
#[error("authentication failed: {0}")]
Authentication(String),
#[error("transfer failed: {0}")]
Transfer(String),
#[error("transfer cancelled")]
TransferCancelled,
#[error("{0} is not implemented yet")]
NotImplemented(&'static str),
}
pub type Result<T> = std::result::Result<T, Error>;