Skip to main content

kellnr_docs/
docs_error.rs

1use hyper::StatusCode;
2use kellnr_error::api_error::ApiError;
3use kellnr_storage::storage_error::StorageError;
4use thiserror::Error;
5
6#[derive(Error, Debug)]
7pub enum DocsError {
8    #[error("Failed to extract docs")]
9    ExtractFailed,
10    #[error("Crate with version does not exist: {0}-{1}")]
11    CrateDoesNotExist(String, String),
12    #[error("Database error: {0}")]
13    DatabaseError(#[from] kellnr_db::error::DbError),
14    #[error("IO error: {0}")]
15    IoError(#[from] std::io::Error),
16    #[error("Cargo error: {0}")]
17    CargoError(String),
18    #[error("Docs storage error: {0}")]
19    StorageError(#[from] StorageError),
20    #[error("Archive exceeds the maximum uncompressed size or number of entries")]
21    ArchiveTooLarge,
22    #[error("Docs build timed out after {0} seconds")]
23    BuildTimeout(u64),
24    #[error("Path {path} is not inside {root}")]
25    PathPrefixMismatch { path: String, root: String },
26}
27
28impl From<DocsError> for ApiError {
29    fn from(e: DocsError) -> Self {
30        match e {
31            DocsError::ExtractFailed => ApiError::from_err(&e, StatusCode::INTERNAL_SERVER_ERROR),
32            DocsError::CrateDoesNotExist(_, _) => ApiError::from_err(&e, StatusCode::NOT_FOUND),
33            DocsError::DatabaseError(db_error) => ApiError::from(db_error),
34            DocsError::IoError(error) => ApiError::from(error),
35            DocsError::CargoError(error) => ApiError::new(
36                &error,
37                &String::default(),
38                StatusCode::INTERNAL_SERVER_ERROR,
39            ),
40            DocsError::StorageError(error) => ApiError::from(error),
41            DocsError::ArchiveTooLarge => ApiError::from_err(&e, StatusCode::BAD_REQUEST),
42            DocsError::BuildTimeout(_) | DocsError::PathPrefixMismatch { .. } => {
43                ApiError::internal(&e)
44            }
45        }
46    }
47}