AppFlowy-Cloud/libs/shared-entity/src/error_code.rs

108 lines
2.5 KiB
Rust

use serde_repr::{Deserialize_repr, Serialize_repr};
use crate::app_error::AppError;
use thiserror::Error;
#[derive(Clone, Copy, Debug, Error, Default, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
#[repr(i32)]
pub enum ErrorCode {
#[error("Operation completed successfully.")]
#[default]
Ok = 0,
#[error("An unhandled error occurred.")]
Unhandled = -1,
#[error("Record not found")]
RecordNotFound = -2,
#[error("Record already exist")]
RecordAlreadyExists = -3,
#[error("Invalid email format.")]
InvalidEmail = 1001,
#[error("Invalid password.")]
InvalidPassword = 1002,
#[error("OAuth authentication error.")]
OAuthError = 1003,
#[error("Missing Payload")]
MissingPayload = 1004,
#[error("Database error")]
DBError = 1005,
#[error("Open Error")]
OpenError = 1006,
#[error("Invalid Url")]
InvalidUrl = 1007,
#[error("Invalid Request Parameters")]
InvalidRequestParams = 1008,
#[error("Url Missing Parameter")]
UrlMissingParameter = 1009,
#[error("Invalid OAuth Provider")]
InvalidOAuthProvider = 1010,
#[error("Not Logged In")]
NotLoggedIn = 1011,
#[error("Not Enough Permissions")]
NotEnoughPermissions = 1012,
#[error("User name cannot be empty")]
UserNameIsEmpty = 1013,
#[error("S3 Error")]
S3Error = 1014,
#[error("Storage space not enough")]
StorageSpaceNotEnough = 1015,
#[error("Payload too large")]
PayloadTooLarge = 1016,
#[error("io error")]
IO = 1017,
}
/// Implements conversion from `anyhow::Error` to `ErrorCode`.
///
/// This implementation checks if the `anyhow::Error` can be downcasted
/// to an `AppError` or `ErrorCode`. If the error is of type `AppError`,
/// it returns the associated error code. If the error can be downcasted
/// to `ErrorCode`, it returns the error code directly. Otherwise, it
/// defaults to `ErrorCode::Unhandled`.
impl From<anyhow::Error> for ErrorCode {
fn from(err: anyhow::Error) -> Self {
if let Some(err) = err.downcast_ref::<AppError>() {
return err.code;
}
err.downcast::<ErrorCode>().unwrap_or(ErrorCode::Unhandled)
}
}
pub fn invalid_email_error(email: &str) -> AppError {
AppError::new(ErrorCode::InvalidEmail, format!("invalid email: {}", email))
}
pub fn invalid_password_error(password: &str) -> AppError {
AppError::new(
ErrorCode::InvalidPassword,
format!("invalid password: {}", password),
)
}
pub fn url_missing_param(param: &str) -> AppError {
AppError::new(
ErrorCode::UrlMissingParameter,
format!("url missing parameter: {}", param),
)
}