forked from jmug/stoatchat
Merge remote-tracking branch 'origin/main' into livekit
This commit is contained in:
91
crates/core/result/src/axum.rs
Normal file
91
crates/core/result/src/axum.rs
Normal file
@@ -0,0 +1,91 @@
|
||||
use axum::{http::StatusCode, response::IntoResponse, Json};
|
||||
use rocket::http::Status;
|
||||
|
||||
use crate::{Error, ErrorType};
|
||||
|
||||
/// HTTP response builder for Error enum
|
||||
impl IntoResponse for Error {
|
||||
fn into_response(self) -> axum::response::Response {
|
||||
let status = match self.error_type {
|
||||
ErrorType::LabelMe => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
|
||||
ErrorType::AlreadyOnboarded => StatusCode::FORBIDDEN,
|
||||
|
||||
ErrorType::UnknownUser => StatusCode::NOT_FOUND,
|
||||
ErrorType::InvalidUsername => StatusCode::BAD_REQUEST,
|
||||
ErrorType::UsernameTaken => StatusCode::CONFLICT,
|
||||
ErrorType::DiscriminatorChangeRatelimited => StatusCode::TOO_MANY_REQUESTS,
|
||||
ErrorType::AlreadyFriends => StatusCode::CONFLICT,
|
||||
ErrorType::AlreadySentRequest => StatusCode::CONFLICT,
|
||||
ErrorType::Blocked => StatusCode::CONFLICT,
|
||||
ErrorType::BlockedByOther => StatusCode::FORBIDDEN,
|
||||
ErrorType::NotFriends => StatusCode::FORBIDDEN,
|
||||
ErrorType::TooManyPendingFriendRequests { .. } => StatusCode::BAD_REQUEST,
|
||||
|
||||
ErrorType::UnknownChannel => StatusCode::NOT_FOUND,
|
||||
ErrorType::UnknownMessage => StatusCode::NOT_FOUND,
|
||||
ErrorType::UnknownAttachment => StatusCode::BAD_REQUEST,
|
||||
ErrorType::CannotEditMessage => StatusCode::FORBIDDEN,
|
||||
ErrorType::CannotJoinCall => StatusCode::BAD_REQUEST,
|
||||
ErrorType::TooManyAttachments { .. } => StatusCode::BAD_REQUEST,
|
||||
ErrorType::TooManyReplies { .. } => StatusCode::BAD_REQUEST,
|
||||
ErrorType::EmptyMessage => StatusCode::UNPROCESSABLE_ENTITY,
|
||||
ErrorType::PayloadTooLarge => StatusCode::UNPROCESSABLE_ENTITY,
|
||||
ErrorType::CannotRemoveYourself => StatusCode::BAD_REQUEST,
|
||||
ErrorType::GroupTooLarge { .. } => StatusCode::FORBIDDEN,
|
||||
ErrorType::AlreadyInGroup => StatusCode::CONFLICT,
|
||||
ErrorType::NotInGroup => StatusCode::NOT_FOUND,
|
||||
ErrorType::AlreadyPinned => StatusCode::BAD_REQUEST,
|
||||
ErrorType::NotPinned => StatusCode::BAD_REQUEST,
|
||||
|
||||
ErrorType::UnknownServer => StatusCode::NOT_FOUND,
|
||||
ErrorType::InvalidRole => StatusCode::NOT_FOUND,
|
||||
ErrorType::Banned => StatusCode::FORBIDDEN,
|
||||
ErrorType::AlreadyInServer => StatusCode::CONFLICT,
|
||||
|
||||
ErrorType::TooManyServers { .. } => StatusCode::BAD_REQUEST,
|
||||
ErrorType::TooManyEmbeds { .. } => StatusCode::BAD_REQUEST,
|
||||
ErrorType::TooManyEmoji { .. } => StatusCode::BAD_REQUEST,
|
||||
ErrorType::TooManyChannels { .. } => StatusCode::BAD_REQUEST,
|
||||
ErrorType::TooManyRoles { .. } => StatusCode::BAD_REQUEST,
|
||||
|
||||
ErrorType::ReachedMaximumBots => StatusCode::BAD_REQUEST,
|
||||
ErrorType::IsBot => StatusCode::BAD_REQUEST,
|
||||
ErrorType::BotIsPrivate => StatusCode::FORBIDDEN,
|
||||
|
||||
ErrorType::CannotReportYourself => StatusCode::BAD_REQUEST,
|
||||
|
||||
ErrorType::MissingPermission { .. } => StatusCode::FORBIDDEN,
|
||||
ErrorType::MissingUserPermission { .. } => StatusCode::FORBIDDEN,
|
||||
ErrorType::NotElevated => StatusCode::FORBIDDEN,
|
||||
ErrorType::NotPrivileged => StatusCode::FORBIDDEN,
|
||||
ErrorType::CannotGiveMissingPermissions => StatusCode::FORBIDDEN,
|
||||
ErrorType::NotOwner => StatusCode::FORBIDDEN,
|
||||
|
||||
ErrorType::DatabaseError { .. } => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
ErrorType::InternalError => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
ErrorType::InvalidOperation => StatusCode::BAD_REQUEST,
|
||||
ErrorType::InvalidCredentials => StatusCode::UNAUTHORIZED,
|
||||
ErrorType::InvalidProperty => StatusCode::BAD_REQUEST,
|
||||
ErrorType::InvalidSession => StatusCode::UNAUTHORIZED,
|
||||
ErrorType::NotAuthenticated => StatusCode::UNAUTHORIZED,
|
||||
ErrorType::DuplicateNonce => StatusCode::CONFLICT,
|
||||
ErrorType::VosoUnavailable => StatusCode::BAD_REQUEST,
|
||||
ErrorType::NotFound => StatusCode::NOT_FOUND,
|
||||
ErrorType::NoEffect => StatusCode::OK,
|
||||
ErrorType::FailedValidation { .. } => StatusCode::BAD_REQUEST,
|
||||
ErrorType::LiveKitUnavailable => StatusCode::BAD_REQUEST,
|
||||
ErrorType::AlreadyInVoiceChannel => StatusCode::BAD_REQUEST,
|
||||
ErrorType::NotAVoiceChannel => StatusCode::BAD_REQUEST,
|
||||
ErrorType::AlreadyConnected => StatusCode::BAD_REQUEST,
|
||||
ErrorType::ProxyError => StatusCode::BAD_REQUEST,
|
||||
ErrorType::FileTooSmall => StatusCode::UNPROCESSABLE_ENTITY,
|
||||
ErrorType::FileTooLarge { .. } => StatusCode::UNPROCESSABLE_ENTITY,
|
||||
ErrorType::FileTypeNotAllowed => StatusCode::BAD_REQUEST,
|
||||
ErrorType::ImageProcessingFailed => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
ErrorType::NoEmbedData => StatusCode::BAD_REQUEST,
|
||||
};
|
||||
|
||||
(status, Json(&self)).into_response()
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
use std::panic::Location;
|
||||
use std::fmt::Display;
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
#[macro_use]
|
||||
@@ -8,9 +9,16 @@ extern crate serde;
|
||||
#[macro_use]
|
||||
extern crate schemars;
|
||||
|
||||
#[cfg(feature = "utoipa")]
|
||||
#[macro_use]
|
||||
extern crate utoipa;
|
||||
|
||||
#[cfg(feature = "rocket")]
|
||||
pub mod rocket;
|
||||
|
||||
#[cfg(feature = "axum")]
|
||||
pub mod axum;
|
||||
|
||||
#[cfg(feature = "okapi")]
|
||||
pub mod okapi;
|
||||
|
||||
@@ -20,6 +28,7 @@ pub type Result<T, E = Error> = std::result::Result<T, E>;
|
||||
/// Error information
|
||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
#[cfg_attr(feature = "schemas", derive(JsonSchema))]
|
||||
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Error {
|
||||
/// Type of error and additional information
|
||||
@@ -30,10 +39,19 @@ pub struct Error {
|
||||
pub location: String,
|
||||
}
|
||||
|
||||
impl Display for Error {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{:?} occurred in {}", self.error_type, self.location)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::error::Error for Error {}
|
||||
|
||||
/// Possible error types
|
||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
#[cfg_attr(feature = "serde", serde(tag = "type"))]
|
||||
#[cfg_attr(feature = "schemas", derive(JsonSchema))]
|
||||
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum ErrorType {
|
||||
/// This error was not labeled :(
|
||||
@@ -52,6 +70,9 @@ pub enum ErrorType {
|
||||
Blocked,
|
||||
BlockedByOther,
|
||||
NotFriends,
|
||||
TooManyPendingFriendRequests {
|
||||
max: usize,
|
||||
},
|
||||
|
||||
// ? Channel related errors
|
||||
UnknownChannel,
|
||||
@@ -79,6 +100,8 @@ pub enum ErrorType {
|
||||
},
|
||||
AlreadyInGroup,
|
||||
NotInGroup,
|
||||
AlreadyPinned,
|
||||
NotPinned,
|
||||
|
||||
// ? Server related errors
|
||||
UnknownServer,
|
||||
@@ -125,6 +148,7 @@ pub enum ErrorType {
|
||||
InvalidCredentials,
|
||||
InvalidProperty,
|
||||
InvalidSession,
|
||||
NotAuthenticated,
|
||||
DuplicateNonce,
|
||||
NotFound,
|
||||
NoEffect,
|
||||
@@ -136,7 +160,19 @@ pub enum ErrorType {
|
||||
LiveKitUnavailable,
|
||||
AlreadyInVoiceChannel,
|
||||
NotAVoiceChannel,
|
||||
AlreadyConnected
|
||||
AlreadyConnected,
|
||||
// ? Micro-service errors
|
||||
ProxyError,
|
||||
FileTooSmall,
|
||||
FileTooLarge {
|
||||
max: usize,
|
||||
},
|
||||
FileTypeNotAllowed,
|
||||
ImageProcessingFailed,
|
||||
NoEmbedData,
|
||||
|
||||
// ? Legacy errors
|
||||
VosoUnavailable,
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
|
||||
@@ -25,6 +25,7 @@ impl<'r> Responder<'r, 'static> for Error {
|
||||
ErrorType::Blocked => Status::Conflict,
|
||||
ErrorType::BlockedByOther => Status::Forbidden,
|
||||
ErrorType::NotFriends => Status::Forbidden,
|
||||
ErrorType::TooManyPendingFriendRequests { .. } => Status::BadRequest,
|
||||
|
||||
ErrorType::UnknownChannel => Status::NotFound,
|
||||
ErrorType::UnknownMessage => Status::NotFound,
|
||||
@@ -39,6 +40,8 @@ impl<'r> Responder<'r, 'static> for Error {
|
||||
ErrorType::GroupTooLarge { .. } => Status::Forbidden,
|
||||
ErrorType::AlreadyInGroup => Status::Conflict,
|
||||
ErrorType::NotInGroup => Status::NotFound,
|
||||
ErrorType::AlreadyPinned => Status::BadRequest,
|
||||
ErrorType::NotPinned => Status::BadRequest,
|
||||
|
||||
ErrorType::UnknownServer => Status::NotFound,
|
||||
ErrorType::InvalidRole => Status::NotFound,
|
||||
@@ -70,15 +73,22 @@ impl<'r> Responder<'r, 'static> for Error {
|
||||
ErrorType::InvalidCredentials => Status::Unauthorized,
|
||||
ErrorType::InvalidProperty => Status::BadRequest,
|
||||
ErrorType::InvalidSession => Status::Unauthorized,
|
||||
ErrorType::NotAuthenticated => Status::Unauthorized,
|
||||
ErrorType::DuplicateNonce => Status::Conflict,
|
||||
ErrorType::NotFound => Status::NotFound,
|
||||
ErrorType::NoEffect => Status::Ok,
|
||||
ErrorType::FailedValidation { .. } => Status::BadRequest,
|
||||
|
||||
ErrorType::LiveKitUnavailable => Status::BadRequest,
|
||||
ErrorType::AlreadyInVoiceChannel => Status::BadRequest,
|
||||
ErrorType::NotAVoiceChannel => Status::BadRequest,
|
||||
ErrorType::AlreadyConnected => Status::BadRequest
|
||||
ErrorType::AlreadyConnected => Status::BadRequest,
|
||||
ErrorType::ProxyError => Status::BadRequest,
|
||||
ErrorType::FileTooSmall => Status::UnprocessableEntity,
|
||||
ErrorType::FileTooLarge { .. } => Status::UnprocessableEntity,
|
||||
ErrorType::FileTypeNotAllowed => Status::BadRequest,
|
||||
ErrorType::ImageProcessingFailed => Status::InternalServerError,
|
||||
ErrorType::NoEmbedData => Status::BadRequest,
|
||||
ErrorType::VosoUnavailable => Status::BadRequest,
|
||||
};
|
||||
|
||||
// Serialize the error data structure into JSON.
|
||||
|
||||
Reference in New Issue
Block a user