Skip to main content

coven_replication/sync/store/pull/
support.rs

1#[derive(Debug)]
2pub enum PullError {
3    Storage(coven_protocol::objects::StorageError),
4    MembershipObject(coven_protocol::objects::StoreObjectError),
5    MembershipLoad(crate::sync::store::membership::AnchoredChainError),
6    Apply(String),
7    /// The sync storage requires a schema version newer than ours.
8    /// The client must upgrade before syncing.
9    SchemaVersionTooOld {
10        local_version: u32,
11        min_version: u32,
12    },
13    /// The membership chain is not anchored to the store's pinned owner — it was
14    /// wiped and/or refounded under a different key (an owner-takeover attempt,
15    /// issue #95). The cycle is refused rather than trusting the tampered chain.
16    MembershipTampered(String),
17}
18
19impl std::fmt::Display for PullError {
20    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        match self {
22            PullError::Storage(e) => write!(f, "storage error: {e}"),
23            PullError::MembershipObject(e) => {
24                write!(f, "membership storage failed: {e}")
25            }
26            PullError::MembershipLoad(e) => write!(f, "membership chain failed: {e}"),
27            PullError::Apply(e) => write!(f, "changeset apply failed: {e}"),
28            PullError::SchemaVersionTooOld {
29                local_version,
30                min_version,
31            } => write!(
32                f,
33                "Update the app to keep syncing — this store was upgraded by a newer device (schema v{min_version}; you have v{local_version})."
34            ),
35            PullError::MembershipTampered(e) => write!(f, "membership chain tampered: {e}"),
36        }
37    }
38}
39
40impl std::error::Error for PullError {
41    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
42        match self {
43            Self::Storage(error) => Some(error),
44            Self::MembershipObject(error) => Some(error),
45            Self::MembershipLoad(error) => Some(error),
46            Self::Apply(_) | Self::SchemaVersionTooOld { .. } | Self::MembershipTampered(_) => None,
47        }
48    }
49}