do_memory_core/sync/
conflict.rs1use crate::{Episode, Heuristic, Pattern};
4use std::sync::Arc;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
8pub enum ConflictResolution {
9 #[default]
11 TursoWins,
12 RedbWins,
14 MostRecent,
16}
17
18#[must_use]
20pub fn resolve_episode_conflict(
21 turso_episode: &Arc<Episode>,
22 redb_episode: &Arc<Episode>,
23 strategy: ConflictResolution,
24) -> Arc<Episode> {
25 match strategy {
26 ConflictResolution::TursoWins => Arc::clone(turso_episode),
27 ConflictResolution::RedbWins => Arc::clone(redb_episode),
28 ConflictResolution::MostRecent => {
29 let turso_time = turso_episode.end_time.unwrap_or(turso_episode.start_time);
31 let redb_time = redb_episode.end_time.unwrap_or(redb_episode.start_time);
32
33 if turso_time >= redb_time {
34 Arc::clone(turso_episode)
35 } else {
36 Arc::clone(redb_episode)
37 }
38 }
39 }
40}
41
42#[must_use]
44pub fn resolve_pattern_conflict(
45 turso_pattern: &Arc<Pattern>,
46 redb_pattern: &Arc<Pattern>,
47 strategy: ConflictResolution,
48) -> Arc<Pattern> {
49 match strategy {
50 ConflictResolution::TursoWins => Arc::clone(turso_pattern),
51 ConflictResolution::RedbWins => Arc::clone(redb_pattern),
52 ConflictResolution::MostRecent => {
53 if turso_pattern.success_rate() >= redb_pattern.success_rate() {
55 Arc::clone(turso_pattern)
56 } else {
57 Arc::clone(redb_pattern)
58 }
59 }
60 }
61}
62
63#[must_use]
65pub fn resolve_heuristic_conflict(
66 turso_heuristic: &Arc<Heuristic>,
67 redb_heuristic: &Arc<Heuristic>,
68 strategy: ConflictResolution,
69) -> Arc<Heuristic> {
70 match strategy {
71 ConflictResolution::TursoWins => Arc::clone(turso_heuristic),
72 ConflictResolution::RedbWins => Arc::clone(redb_heuristic),
73 ConflictResolution::MostRecent => {
74 if turso_heuristic.updated_at >= redb_heuristic.updated_at {
75 Arc::clone(turso_heuristic)
76 } else {
77 Arc::clone(redb_heuristic)
78 }
79 }
80 }
81}