use std::sync::Arc;
#[derive(Clone, Debug, thiserror::Error)]
pub enum AsyncHttpRangeReaderError {
#[error("range requests are not supported")]
HttpRangeRequestUnsupported,
#[error(transparent)]
HttpError(#[from] Arc<reqwest_middleware::Error>),
#[error("an error occurred during transport: {0}")]
TransportError(#[source] Arc<reqwest_middleware::Error>),
#[error("io error occurred: {0}")]
IoError(#[source] Arc<std::io::Error>),
#[error("content-range header is missing from response")]
ContentRangeMissing,
#[error("content-length header is missing from response")]
ContentLengthMissing,
#[error("memory mapping the file failed")]
MemoryMapError(#[source] Arc<std::io::Error>),
#[error("invalid Content-Range header: {0}")]
ContentRangeParser(String),
#[error(
"request and response range mismatch, \
expected {expected_start}-{expected_end_inclusive}/{expected_complete_length}, \
got {actual_start}-{actual_end_inclusive}/{actual_complete_length}"
)]
RangeMismatch {
expected_start: u64,
expected_end_inclusive: u64,
expected_complete_length: usize,
actual_start: u64,
actual_end_inclusive: u64,
actual_complete_length: u64,
},
#[error("range response returned more than the expected {expected} bytes")]
ResponseTooLong { expected: u64 },
#[error("expected {expected} bytes from range response, got {actual}")]
ResponseTooShort { expected: u64, actual: u64 },
}
impl From<std::io::Error> for AsyncHttpRangeReaderError {
fn from(err: std::io::Error) -> Self {
AsyncHttpRangeReaderError::IoError(Arc::new(err))
}
}
impl From<reqwest_middleware::Error> for AsyncHttpRangeReaderError {
fn from(err: reqwest_middleware::Error) -> Self {
AsyncHttpRangeReaderError::TransportError(Arc::new(err))
}
}
impl From<reqwest::Error> for AsyncHttpRangeReaderError {
fn from(err: reqwest::Error) -> Self {
AsyncHttpRangeReaderError::TransportError(Arc::new(err.into()))
}
}