123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- use std::{error::Error, fmt, fmt::Debug, str::Utf8Error};
- #[derive(Clone, Debug)]
- pub struct OTError {
- pub code: OTErrorCode,
- pub msg: String,
- }
- macro_rules! static_ot_error {
- ($name:ident, $code:expr) => {
- #[allow(non_snake_case, missing_docs)]
- pub fn $name() -> OTError { $code.into() }
- };
- }
- impl std::convert::From<OTErrorCode> for OTError {
- fn from(code: OTErrorCode) -> Self {
- OTError {
- code: code.clone(),
- msg: format!("{:?}", code),
- }
- }
- }
- impl OTError {
- pub fn new(code: OTErrorCode, msg: &str) -> OTError {
- Self {
- code,
- msg: msg.to_owned(),
- }
- }
- pub fn context<T: Debug>(mut self, error: T) -> Self {
- self.msg = format!("{:?}", error);
- self
- }
- static_ot_error!(duplicate_revision, OTErrorCode::DuplicatedRevision);
- static_ot_error!(revision_id_conflict, OTErrorCode::RevisionIDConflict);
- static_ot_error!(internal, OTErrorCode::Internal);
- }
- impl fmt::Display for OTError {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "incompatible lengths") }
- }
- impl Error for OTError {
- fn source(&self) -> Option<&(dyn Error + 'static)> { None }
- }
- impl std::convert::From<serde_json::Error> for OTError {
- fn from(error: serde_json::Error) -> Self { ErrorBuilder::new(OTErrorCode::SerdeError).error(error).build() }
- }
- impl std::convert::From<Utf8Error> for OTError {
- fn from(error: Utf8Error) -> Self { ErrorBuilder::new(OTErrorCode::SerdeError).error(error).build() }
- }
- #[derive(Debug, Clone)]
- pub enum OTErrorCode {
- IncompatibleLength,
- ApplyInsertFail,
- ApplyDeleteFail,
- ApplyFormatFail,
- ComposeOperationFail,
- IntervalOutOfBound,
- UndoFail,
- RedoFail,
- SerdeError,
- DuplicatedRevision,
- RevisionIDConflict,
- Internal,
- }
- pub struct ErrorBuilder {
- pub code: OTErrorCode,
- pub msg: Option<String>,
- }
- impl ErrorBuilder {
- pub fn new(code: OTErrorCode) -> Self { ErrorBuilder { code, msg: None } }
- pub fn msg<T>(mut self, msg: T) -> Self
- where
- T: Into<String>,
- {
- self.msg = Some(msg.into());
- self
- }
- pub fn error<T>(mut self, msg: T) -> Self
- where
- T: std::fmt::Debug,
- {
- self.msg = Some(format!("{:?}", msg));
- self
- }
- pub fn build(mut self) -> OTError { OTError::new(self.code, &self.msg.take().unwrap_or_else(|| "".to_owned())) }
- }
- pub(crate) fn internal_error<T>(e: T) -> OTError
- where
- T: std::fmt::Debug,
- {
- OTError::internal().context(e)
- }
|