use super::OfflineMutation;
use crate::client_contract::{FailureCode, IdempotencyKey};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", content = "code", rename_all = "snake_case")]
#[non_exhaustive]
pub enum OfflineConflictReason {
ServerConflict(FailureCode),
ConcurrentServerChange,
FullResyncDivergence,
PermanentRejection(FailureCode),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[non_exhaustive]
pub struct OfflineConflict {
pub(super) mutation: OfflineMutation,
pub(super) authoritative_revision: Option<u64>,
pub(super) reason: OfflineConflictReason,
}
impl OfflineConflict {
pub const fn mutation(&self) -> &OfflineMutation {
&self.mutation
}
pub const fn authoritative_revision(&self) -> Option<u64> {
self.authoritative_revision
}
pub const fn reason(&self) -> &OfflineConflictReason {
&self.reason
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum ConflictResolution {
AcceptServer,
RetryAgainstServer {
idempotency_key: IdempotencyKey,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct RecoverySummary {
pub records_cleared: usize,
pub pending_preserved: usize,
pub conflicts_preserved: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct ErasureSummary {
pub records_erased: usize,
pub pending_erased: usize,
pub conflicts_erased: usize,
}