mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
refactor errors
This commit is contained in:
@ -1,13 +1,10 @@
|
||||
use crate::protobuf::ErrorCode as ProtoBufErrorCode;
|
||||
use bytes::Bytes;
|
||||
use derive_more::Display;
|
||||
use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
|
||||
use error_code::ErrorCode;
|
||||
use flowy_derive::ProtoBuf;
|
||||
use lib_dispatch::prelude::{EventResponse, ResponseBuilder};
|
||||
use protobuf::ProtobufEnum;
|
||||
use std::{
|
||||
convert::{TryFrom, TryInto},
|
||||
fmt::Debug,
|
||||
};
|
||||
use std::{convert::TryInto, fmt, fmt::Debug};
|
||||
|
||||
pub type FlowyResult<T> = std::result::Result<T, FlowyError>;
|
||||
|
||||
#[derive(Debug, Default, Clone, ProtoBuf)]
|
||||
pub struct FlowyError {
|
||||
@ -18,7 +15,7 @@ pub struct FlowyError {
|
||||
pub msg: String,
|
||||
}
|
||||
|
||||
macro_rules! static_any_error {
|
||||
macro_rules! static_flowy_error {
|
||||
($name:ident, $code:expr) => {
|
||||
#[allow(non_snake_case, missing_docs)]
|
||||
pub fn $name() -> FlowyError { $code.into() }
|
||||
@ -37,7 +34,34 @@ impl FlowyError {
|
||||
self
|
||||
}
|
||||
|
||||
static_any_error!(internal, ErrorCode::Internal);
|
||||
static_flowy_error!(internal, ErrorCode::Internal);
|
||||
static_flowy_error!(record_not_found, ErrorCode::RecordNotFound);
|
||||
static_flowy_error!(workspace_name, ErrorCode::WorkspaceNameInvalid);
|
||||
static_flowy_error!(workspace_id, ErrorCode::WorkspaceIdInvalid);
|
||||
static_flowy_error!(color_style, ErrorCode::AppColorStyleInvalid);
|
||||
static_flowy_error!(workspace_desc, ErrorCode::WorkspaceDescTooLong);
|
||||
static_flowy_error!(app_name, ErrorCode::AppNameInvalid);
|
||||
static_flowy_error!(invalid_app_id, ErrorCode::AppIdInvalid);
|
||||
static_flowy_error!(view_name, ErrorCode::ViewNameInvalid);
|
||||
static_flowy_error!(view_thumbnail, ErrorCode::ViewThumbnailInvalid);
|
||||
static_flowy_error!(invalid_view_id, ErrorCode::ViewIdInvalid);
|
||||
static_flowy_error!(view_desc, ErrorCode::ViewDescTooLong);
|
||||
static_flowy_error!(view_data, ErrorCode::ViewDataInvalid);
|
||||
static_flowy_error!(unauthorized, ErrorCode::UserUnauthorized);
|
||||
static_flowy_error!(connection, ErrorCode::ConnectError);
|
||||
static_flowy_error!(email_empty, ErrorCode::EmailIsEmpty);
|
||||
static_flowy_error!(email_format, ErrorCode::EmailFormatInvalid);
|
||||
static_flowy_error!(email_exist, ErrorCode::EmailAlreadyExists);
|
||||
static_flowy_error!(password_empty, ErrorCode::PasswordIsEmpty);
|
||||
static_flowy_error!(passworkd_too_long, ErrorCode::PasswordTooLong);
|
||||
static_flowy_error!(password_forbid_char, ErrorCode::PasswordContainsForbidCharacters);
|
||||
static_flowy_error!(password_format, ErrorCode::PasswordFormatInvalid);
|
||||
static_flowy_error!(password_not_match, ErrorCode::PasswordNotMatch);
|
||||
static_flowy_error!(name_too_long, ErrorCode::UserNameTooLong);
|
||||
static_flowy_error!(name_forbid_char, ErrorCode::UserNameContainForbiddenCharacters);
|
||||
static_flowy_error!(name_empty, ErrorCode::UserNameIsEmpty);
|
||||
static_flowy_error!(user_id, ErrorCode::UserIdInvalid);
|
||||
static_flowy_error!(user_not_exist, ErrorCode::UserNotExist);
|
||||
}
|
||||
|
||||
impl std::convert::From<ErrorCode> for FlowyError {
|
||||
@ -49,26 +73,6 @@ impl std::convert::From<ErrorCode> for FlowyError {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, ProtoBuf_Enum, Display, PartialEq, Eq)]
|
||||
pub enum ErrorCode {
|
||||
#[display(fmt = "Internal error")]
|
||||
Internal = 0,
|
||||
}
|
||||
|
||||
impl ErrorCode {
|
||||
pub fn value(&self) -> i32 {
|
||||
let code: ProtoBufErrorCode = self.clone().try_into().unwrap();
|
||||
code.value()
|
||||
}
|
||||
|
||||
pub fn from_i32(value: i32) -> Self {
|
||||
match ProtoBufErrorCode::from_i32(value) {
|
||||
None => ErrorCode::Internal,
|
||||
Some(code) => ErrorCode::try_from(&code).unwrap(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn internal_error<T>(e: T) -> FlowyError
|
||||
where
|
||||
T: std::fmt::Debug,
|
||||
@ -76,9 +80,21 @@ where
|
||||
FlowyError::internal().context(e)
|
||||
}
|
||||
|
||||
impl fmt::Display for FlowyError {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}: {}", &self.code, &self.msg) }
|
||||
}
|
||||
|
||||
impl lib_dispatch::Error for FlowyError {
|
||||
fn as_response(&self) -> EventResponse {
|
||||
let bytes: Bytes = self.clone().try_into().unwrap();
|
||||
ResponseBuilder::Err().data(bytes).build()
|
||||
}
|
||||
}
|
||||
|
||||
impl std::convert::From<std::io::Error> for FlowyError {
|
||||
fn from(error: std::io::Error) -> Self { FlowyError::internal().context(error) }
|
||||
}
|
||||
|
||||
impl std::convert::From<protobuf::ProtobufError> for FlowyError {
|
||||
fn from(e: protobuf::ProtobufError) -> Self { FlowyError::internal().context(e) }
|
||||
}
|
||||
|
22
frontend/rust-lib/flowy-error/src/ext/backend.rs
Normal file
22
frontend/rust-lib/flowy-error/src/ext/backend.rs
Normal file
@ -0,0 +1,22 @@
|
||||
use crate::FlowyError;
|
||||
use backend_service::errors::{ErrorCode as ServerErrorCode, ServerError};
|
||||
use error_code::ErrorCode;
|
||||
|
||||
impl std::convert::From<ServerError> for FlowyError {
|
||||
fn from(error: ServerError) -> Self {
|
||||
let code = server_error_to_flowy_error(error.code);
|
||||
FlowyError::new(code, &error.msg)
|
||||
}
|
||||
}
|
||||
|
||||
fn server_error_to_flowy_error(code: ServerErrorCode) -> ErrorCode {
|
||||
match code {
|
||||
ServerErrorCode::UserUnauthorized => ErrorCode::UserUnauthorized,
|
||||
ServerErrorCode::PasswordNotMatch => ErrorCode::PasswordNotMatch,
|
||||
ServerErrorCode::RecordNotFound => ErrorCode::RecordNotFound,
|
||||
ServerErrorCode::ConnectRefused | ServerErrorCode::ConnectTimeout | ServerErrorCode::ConnectClose => {
|
||||
ErrorCode::ConnectError
|
||||
},
|
||||
_ => ErrorCode::Internal,
|
||||
}
|
||||
}
|
5
frontend/rust-lib/flowy-error/src/ext/collaborate.rs
Normal file
5
frontend/rust-lib/flowy-error/src/ext/collaborate.rs
Normal file
@ -0,0 +1,5 @@
|
||||
use crate::FlowyError;
|
||||
|
||||
impl std::convert::From<flowy_collaboration::errors::CollaborateError> for FlowyError {
|
||||
fn from(error: flowy_collaboration::errors::CollaborateError) -> Self { FlowyError::internal().context(error) }
|
||||
}
|
15
frontend/rust-lib/flowy-error/src/ext/database.rs
Normal file
15
frontend/rust-lib/flowy-error/src/ext/database.rs
Normal file
@ -0,0 +1,15 @@
|
||||
use crate::FlowyError;
|
||||
|
||||
impl std::convert::From<flowy_database::Error> for FlowyError {
|
||||
fn from(error: flowy_database::Error) -> Self { FlowyError::internal().context(error) }
|
||||
}
|
||||
|
||||
impl std::convert::From<::r2d2::Error> for FlowyError {
|
||||
fn from(error: r2d2::Error) -> Self { FlowyError::internal().context(error) }
|
||||
}
|
||||
|
||||
// use diesel::result::{Error, DatabaseErrorKind};
|
||||
// use lib_sqlite::ErrorKind;
|
||||
impl std::convert::From<lib_sqlite::Error> for FlowyError {
|
||||
fn from(error: lib_sqlite::Error) -> Self { FlowyError::internal().context(error) }
|
||||
}
|
27
frontend/rust-lib/flowy-error/src/ext/mod.rs
Normal file
27
frontend/rust-lib/flowy-error/src/ext/mod.rs
Normal file
@ -0,0 +1,27 @@
|
||||
#[cfg(feature = "collaboration")]
|
||||
mod collaborate;
|
||||
#[cfg(feature = "collaboration")]
|
||||
pub use collaborate::*;
|
||||
|
||||
//
|
||||
#[cfg(feature = "ot")]
|
||||
mod ot;
|
||||
#[cfg(feature = "ot")]
|
||||
pub use ot::*;
|
||||
|
||||
//
|
||||
#[cfg(feature = "serde")]
|
||||
mod serde;
|
||||
#[cfg(feature = "serde")]
|
||||
pub use serde::*;
|
||||
|
||||
//
|
||||
#[cfg(feature = "backend")]
|
||||
mod backend;
|
||||
#[cfg(feature = "backend")]
|
||||
pub use backend::*;
|
||||
|
||||
#[cfg(feature = "db")]
|
||||
mod database;
|
||||
#[cfg(feature = "db")]
|
||||
pub use database::*;
|
5
frontend/rust-lib/flowy-error/src/ext/ot.rs
Normal file
5
frontend/rust-lib/flowy-error/src/ext/ot.rs
Normal file
@ -0,0 +1,5 @@
|
||||
use crate::FlowyError;
|
||||
|
||||
impl std::convert::From<lib_ot::errors::OTError> for FlowyError {
|
||||
fn from(error: lib_ot::errors::OTError) -> Self { FlowyError::internal().context(error) }
|
||||
}
|
5
frontend/rust-lib/flowy-error/src/ext/serde.rs
Normal file
5
frontend/rust-lib/flowy-error/src/ext/serde.rs
Normal file
@ -0,0 +1,5 @@
|
||||
use crate::FlowyError;
|
||||
|
||||
impl std::convert::From<serde_json::Error> for FlowyError {
|
||||
fn from(error: serde_json::Error) -> Self { FlowyError::internal().context(error) }
|
||||
}
|
@ -1,4 +1,6 @@
|
||||
mod errors;
|
||||
mod ext;
|
||||
pub mod protobuf;
|
||||
|
||||
pub use error_code::ErrorCode;
|
||||
pub use errors::*;
|
||||
|
@ -217,67 +217,17 @@ impl ::protobuf::reflect::ProtobufValue for FlowyError {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone,PartialEq,Eq,Debug,Hash)]
|
||||
pub enum ErrorCode {
|
||||
Internal = 0,
|
||||
}
|
||||
|
||||
impl ::protobuf::ProtobufEnum for ErrorCode {
|
||||
fn value(&self) -> i32 {
|
||||
*self as i32
|
||||
}
|
||||
|
||||
fn from_i32(value: i32) -> ::std::option::Option<ErrorCode> {
|
||||
match value {
|
||||
0 => ::std::option::Option::Some(ErrorCode::Internal),
|
||||
_ => ::std::option::Option::None
|
||||
}
|
||||
}
|
||||
|
||||
fn values() -> &'static [Self] {
|
||||
static values: &'static [ErrorCode] = &[
|
||||
ErrorCode::Internal,
|
||||
];
|
||||
values
|
||||
}
|
||||
|
||||
fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
|
||||
static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
|
||||
descriptor.get(|| {
|
||||
::protobuf::reflect::EnumDescriptor::new_pb_name::<ErrorCode>("ErrorCode", file_descriptor_proto())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ::std::marker::Copy for ErrorCode {
|
||||
}
|
||||
|
||||
impl ::std::default::Default for ErrorCode {
|
||||
fn default() -> Self {
|
||||
ErrorCode::Internal
|
||||
}
|
||||
}
|
||||
|
||||
impl ::protobuf::reflect::ProtobufValue for ErrorCode {
|
||||
fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
|
||||
::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
|
||||
}
|
||||
}
|
||||
|
||||
static file_descriptor_proto_data: &'static [u8] = b"\
|
||||
\n\x0cerrors.proto\"2\n\nFlowyError\x12\x12\n\x04code\x18\x01\x20\x01(\
|
||||
\x05R\x04code\x12\x10\n\x03msg\x18\x02\x20\x01(\tR\x03msg*\x19\n\tErrorC\
|
||||
ode\x12\x0c\n\x08Internal\x10\0J\xd9\x01\n\x06\x12\x04\0\0\x08\x01\n\x08\
|
||||
\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\x04\0\x12\x04\x02\0\x05\x01\n\n\n\
|
||||
\x03\x04\0\x01\x12\x03\x02\x08\x12\n\x0b\n\x04\x04\0\x02\0\x12\x03\x03\
|
||||
\x04\x13\n\x0c\n\x05\x04\0\x02\0\x05\x12\x03\x03\x04\t\n\x0c\n\x05\x04\0\
|
||||
\x02\0\x01\x12\x03\x03\n\x0e\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x03\x11\
|
||||
\x12\n\x0b\n\x04\x04\0\x02\x01\x12\x03\x04\x04\x13\n\x0c\n\x05\x04\0\x02\
|
||||
\x01\x05\x12\x03\x04\x04\n\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\x04\x0b\
|
||||
\x0e\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\x04\x11\x12\n\n\n\x02\x05\0\
|
||||
\x12\x04\x06\0\x08\x01\n\n\n\x03\x05\0\x01\x12\x03\x06\x05\x0e\n\x0b\n\
|
||||
\x04\x05\0\x02\0\x12\x03\x07\x04\x11\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\
|
||||
\x07\x04\x0c\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x07\x0f\x10b\x06proto3\
|
||||
\x05R\x04code\x12\x10\n\x03msg\x18\x02\x20\x01(\tR\x03msgJ\x98\x01\n\x06\
|
||||
\x12\x04\0\0\x05\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\x04\0\x12\
|
||||
\x04\x02\0\x05\x01\n\n\n\x03\x04\0\x01\x12\x03\x02\x08\x12\n\x0b\n\x04\
|
||||
\x04\0\x02\0\x12\x03\x03\x04\x13\n\x0c\n\x05\x04\0\x02\0\x05\x12\x03\x03\
|
||||
\x04\t\n\x0c\n\x05\x04\0\x02\0\x01\x12\x03\x03\n\x0e\n\x0c\n\x05\x04\0\
|
||||
\x02\0\x03\x12\x03\x03\x11\x12\n\x0b\n\x04\x04\0\x02\x01\x12\x03\x04\x04\
|
||||
\x13\n\x0c\n\x05\x04\0\x02\x01\x05\x12\x03\x04\x04\n\n\x0c\n\x05\x04\0\
|
||||
\x02\x01\x01\x12\x03\x04\x0b\x0e\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\
|
||||
\x04\x11\x12b\x06proto3\
|
||||
";
|
||||
|
||||
static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
|
||||
|
@ -4,6 +4,3 @@ message FlowyError {
|
||||
int32 code = 1;
|
||||
string msg = 2;
|
||||
}
|
||||
enum ErrorCode {
|
||||
Internal = 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user