use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum OneIoError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("{0}")]
Network(Box<dyn std::error::Error + Send + Sync>),
#[error("{url}: {source}")]
NetworkWithContext {
source: Box<dyn std::error::Error + Send + Sync>,
url: String,
},
#[error("{service} status error: {code}{}", .message.as_deref().map(|m| format!(": {m}")).unwrap_or_default())]
Status {
service: &'static str,
code: u16,
message: Option<String>,
},
#[error("Invalid header: {0}")]
InvalidHeader(String),
#[error("Invalid certificate: {0}")]
InvalidCertificate(String),
#[error("Not supported: {0}")]
NotSupported(String),
}
#[cfg(feature = "http")]
impl From<reqwest::Error> for OneIoError {
fn from(err: reqwest::Error) -> Self {
OneIoError::Network(Box::new(err))
}
}
#[cfg(feature = "ftp")]
impl From<suppaftp::FtpError> for OneIoError {
fn from(err: suppaftp::FtpError) -> Self {
OneIoError::Network(Box::new(err))
}
}
#[cfg(feature = "json")]
impl From<serde_json::Error> for OneIoError {
fn from(err: serde_json::Error) -> Self {
OneIoError::Network(Box::new(err))
}
}