errors.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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 DocError {
  8. #[pb(index = 1)]
  9. pub code: DocErrorCode,
  10. #[pb(index = 2)]
  11. pub msg: String,
  12. }
  13. impl DocError {
  14. fn new(code: DocErrorCode, 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 DocErrorCode {
  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 = "DocOpenFileError")]
  36. DocOpenFileError = 13,
  37. #[display(fmt = "DocFilePathInvalid")]
  38. DocFilePathInvalid = 14,
  39. #[display(fmt = "EditorUserNotLoginYet")]
  40. EditorUserNotLoginYet = 100,
  41. }
  42. impl std::default::Default for DocErrorCode {
  43. fn default() -> Self { DocErrorCode::Unknown }
  44. }
  45. impl std::convert::From<flowy_database::result::Error> for DocError {
  46. fn from(error: flowy_database::result::Error) -> Self {
  47. ErrorBuilder::new(DocErrorCode::EditorDBInternalError)
  48. .error(error)
  49. .build()
  50. }
  51. }
  52. impl std::convert::From<FileError> for DocError {
  53. fn from(error: FileError) -> Self {
  54. ErrorBuilder::new(DocErrorCode::DocOpenFileError)
  55. .error(error)
  56. .build()
  57. }
  58. }
  59. impl flowy_dispatch::Error for DocError {
  60. fn as_response(&self) -> EventResponse {
  61. let bytes: Vec<u8> = self.clone().try_into().unwrap();
  62. ResponseBuilder::Err().data(bytes).build()
  63. }
  64. }
  65. pub struct ErrorBuilder {
  66. pub code: DocErrorCode,
  67. pub msg: Option<String>,
  68. }
  69. impl ErrorBuilder {
  70. pub fn new(code: DocErrorCode) -> Self { ErrorBuilder { code, msg: None } }
  71. pub fn msg<T>(mut self, msg: T) -> Self
  72. where
  73. T: Into<String>,
  74. {
  75. self.msg = Some(msg.into());
  76. self
  77. }
  78. pub fn error<T>(mut self, msg: T) -> Self
  79. where
  80. T: std::fmt::Debug,
  81. {
  82. self.msg = Some(format!("{:?}", msg));
  83. self
  84. }
  85. pub fn build(mut self) -> DocError {
  86. DocError::new(self.code, &self.msg.take().unwrap_or("".to_owned()))
  87. }
  88. }