errors.rs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. use crate::services::file_manager::FileError;
  2. use derive_more::Display;
  3. use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
  4. use flowy_dispatch::prelude::{EventResponse, ResponseBuilder};
  5. use std::convert::TryInto;
  6. #[derive(Debug, Default, Clone, ProtoBuf)]
  7. pub struct EditorError {
  8. #[pb(index = 1)]
  9. pub code: EditorErrorCode,
  10. #[pb(index = 2)]
  11. pub msg: String,
  12. }
  13. impl EditorError {
  14. fn new(code: EditorErrorCode, msg: &str) -> Self {
  15. Self {
  16. code,
  17. msg: msg.to_owned(),
  18. }
  19. }
  20. }
  21. #[derive(Debug, Clone, ProtoBuf_Enum, Display, PartialEq, Eq)]
  22. pub enum EditorErrorCode {
  23. #[display(fmt = "Unknown")]
  24. Unknown = 0,
  25. #[display(fmt = "EditorDBInternalError")]
  26. EditorDBInternalError = 1,
  27. #[display(fmt = "EditorDBConnFailed")]
  28. EditorDBConnFailed = 2,
  29. #[display(fmt = "DocNameInvalid")]
  30. DocNameInvalid = 10,
  31. #[display(fmt = "DocViewIdInvalid")]
  32. DocViewIdInvalid = 11,
  33. #[display(fmt = "DocDescTooLong")]
  34. DocDescTooLong = 12,
  35. #[display(fmt = "DocDescTooLong")]
  36. DocFileError = 13,
  37. }
  38. impl std::default::Default for EditorErrorCode {
  39. fn default() -> Self { EditorErrorCode::Unknown }
  40. }
  41. impl std::convert::From<flowy_database::result::Error> for EditorError {
  42. fn from(error: flowy_database::result::Error) -> Self {
  43. ErrorBuilder::new(EditorErrorCode::EditorDBInternalError)
  44. .error(error)
  45. .build()
  46. }
  47. }
  48. impl std::convert::From<FileError> for EditorError {
  49. fn from(error: FileError) -> Self {
  50. ErrorBuilder::new(EditorErrorCode::DocFileError)
  51. .error(error)
  52. .build()
  53. }
  54. }
  55. impl flowy_dispatch::Error for EditorError {
  56. fn as_response(&self) -> EventResponse {
  57. let bytes: Vec<u8> = self.clone().try_into().unwrap();
  58. ResponseBuilder::Err().data(bytes).build()
  59. }
  60. }
  61. pub struct ErrorBuilder {
  62. pub code: EditorErrorCode,
  63. pub msg: Option<String>,
  64. }
  65. impl ErrorBuilder {
  66. pub fn new(code: EditorErrorCode) -> Self { ErrorBuilder { code, msg: None } }
  67. pub fn msg<T>(mut self, msg: T) -> Self
  68. where
  69. T: Into<String>,
  70. {
  71. self.msg = Some(msg.into());
  72. self
  73. }
  74. pub fn error<T>(mut self, msg: T) -> Self
  75. where
  76. T: std::fmt::Debug,
  77. {
  78. self.msg = Some(format!("{:?}", msg));
  79. self
  80. }
  81. pub fn build(mut self) -> EditorError {
  82. EditorError::new(self.code, &self.msg.take().unwrap_or("".to_owned()))
  83. }
  84. }