Skip to main content

common/mount/conflict/
base_wins.rs

1//! Base-wins conflict resolver
2
3use crate::crypto::PublicKey;
4
5use super::types::{Conflict, Resolution};
6use super::ConflictResolver;
7
8/// Base-wins conflict resolution (conservative)
9///
10/// The local (base) operation always wins over incoming operations.
11/// Use this when you want to preserve local changes and require
12/// explicit action to accept remote changes.
13#[derive(Debug, Clone, Default)]
14pub struct BaseWins;
15
16impl BaseWins {
17    /// Create a new BaseWins resolver
18    pub fn new() -> Self {
19        Self
20    }
21}
22
23impl ConflictResolver for BaseWins {
24    fn resolve(&self, _conflict: &Conflict, _local_peer: &PublicKey) -> Resolution {
25        Resolution::UseBase
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32    use crate::crypto::SecretKey;
33    use crate::mount::path_ops::{OpId, OpType, PathOperation};
34    use std::path::PathBuf;
35
36    fn make_peer_id(seed: u8) -> PublicKey {
37        let mut seed_bytes = [0u8; 32];
38        seed_bytes[0] = seed;
39        let secret = SecretKey::from(seed_bytes);
40        secret.public()
41    }
42
43    fn make_op(peer_id: PublicKey, timestamp: u64, op_type: OpType, path: &str) -> PathOperation {
44        PathOperation {
45            id: OpId { timestamp, peer_id },
46            op_type,
47            path: PathBuf::from(path),
48            content_link: None,
49            is_dir: false,
50        }
51    }
52
53    #[test]
54    fn test_base_wins() {
55        let peer1 = make_peer_id(1);
56        let peer2 = make_peer_id(2);
57
58        let base = make_op(peer1, 1, OpType::Add, "file.txt");
59        let incoming = make_op(peer2, 2, OpType::Remove, "file.txt");
60
61        let conflict = Conflict::new(PathBuf::from("file.txt"), base, incoming);
62        let resolver = BaseWins::new();
63
64        // BaseWins always returns UseBase regardless of timestamps
65        assert_eq!(resolver.resolve(&conflict, &peer1), Resolution::UseBase);
66    }
67}