use thiserror::Error;
pub type Result<T> = std::result::Result<T, MitmError>;
#[derive(Error, Debug)]
pub enum MitmError {
#[error("Failed to generate CA certificate: {0}")]
CaGenerationFailed(String),
#[error("Failed to load CA certificate: {0}")]
CaLoadFailed(String),
#[error("Failed to generate certificate for domain {domain}: {source}")]
CertGenerationFailed {
domain: String,
source: String,
},
#[error("Failed to parse certificate: {0}")]
CertParseFailed(String),
#[error("TLS handshake failed for {host}: {source}")]
TlsHandshakeFailed {
host: String,
source: String,
},
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("Certificate cache error: {0}")]
CacheError(String),
#[error("Invalid domain name: {0}")]
InvalidDomain(String),
#[error("Unsupported operation: {0}")]
Unsupported(String),
#[error("Invalid CONNECT request: {0}")]
InvalidConnectRequest(String),
#[error("TLS configuration failed: {0}")]
TlsConfigFailed(String),
#[error("Invalid host: {0}")]
InvalidHost(String),
#[error("Upstream connection failed for {host}: {source}")]
UpstreamConnectionFailed {
host: String,
source: String,
},
#[error("Tunnel error: {0}")]
TunnelError(String),
#[error("Request parsing failed: {0}")]
RequestParseFailed(String),
#[error("Response parsing failed: {0}")]
ResponseParseFailed(String),
}
impl MitmError {
pub fn ca_generation(msg: impl Into<String>) -> Self {
Self::CaGenerationFailed(msg.into())
}
pub fn ca_load(msg: impl Into<String>) -> Self {
Self::CaLoadFailed(msg.into())
}
pub fn cert_generation(domain: impl Into<String>, msg: impl Into<String>) -> Self {
Self::CertGenerationFailed {
domain: domain.into(),
source: msg.into(),
}
}
pub fn tls_handshake(host: impl Into<String>, msg: impl Into<String>) -> Self {
Self::TlsHandshakeFailed {
host: host.into(),
source: msg.into(),
}
}
pub fn cache(msg: impl Into<String>) -> Self {
Self::CacheError(msg.into())
}
}