kellnr_docs/
docs_error.rs1use 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}