1use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, SyncError>;
7
8#[derive(Error, Debug, Clone)]
10pub enum SyncError {
11 #[error("Document not found: {0}")]
12 DocumentNotFound(String),
13
14 #[error("Field not found: {0}")]
15 FieldNotFound(String),
16
17 #[error("Invalid timestamp: {0}")]
18 InvalidTimestamp(String),
19
20 #[error("Serialization error: {0}")]
21 SerializationError(String),
22
23 #[error("Deserialization error: {0}")]
24 DeserializationError(String),
25
26 #[error("Storage error: {0}")]
27 StorageError(String),
28
29 #[error("Network error: {0}")]
30 NetworkError(String),
31
32 #[error("Conflict error: {0}")]
33 ConflictError(String),
34
35 #[error("Invalid operation: {0}")]
36 InvalidOperation(String),
37
38 #[error("Protocol error: {0}")]
39 Protocol(String),
40}
41
42impl SyncError {
43 pub fn is_retryable(&self) -> bool {
45 matches!(
46 self,
47 SyncError::NetworkError(_) | SyncError::StorageError(_) | SyncError::ConflictError(_)
48 )
49 }
50
51 pub fn code(&self) -> &'static str {
53 match self {
54 SyncError::DocumentNotFound(_) => "DOCUMENT_NOT_FOUND",
55 SyncError::FieldNotFound(_) => "FIELD_NOT_FOUND",
56 SyncError::InvalidTimestamp(_) => "INVALID_TIMESTAMP",
57 SyncError::SerializationError(_) => "SERIALIZATION_ERROR",
58 SyncError::DeserializationError(_) => "DESERIALIZATION_ERROR",
59 SyncError::StorageError(_) => "STORAGE_ERROR",
60 SyncError::NetworkError(_) => "NETWORK_ERROR",
61 SyncError::ConflictError(_) => "CONFLICT_ERROR",
62 SyncError::InvalidOperation(_) => "INVALID_OPERATION",
63 SyncError::Protocol(_) => "PROTOCOL_ERROR",
64 }
65 }
66}