@@ -19,18 +19,66 @@ pub enum DiffResult {
1919 Modified ( Vec < u8 > , Vec < u8 > , Vec < u8 > ) ,
2020}
2121
22- #[ derive( Debug , PartialEq ) ]
22+ #[ derive( Debug , PartialEq , Clone ) ]
2323pub enum MergeResult {
2424 Added ( Vec < u8 > , Vec < u8 > ) ,
2525 Removed ( Vec < u8 > ) ,
2626 Modified ( Vec < u8 > , Vec < u8 > ) ,
2727 Conflict ( MergeConflict ) ,
2828}
2929
30- #[ derive( Debug , PartialEq ) ]
30+ #[ derive( Debug , PartialEq , Clone ) ]
3131pub struct MergeConflict {
3232 pub key : Vec < u8 > ,
3333 pub base_value : Option < Vec < u8 > > ,
3434 pub source_value : Option < Vec < u8 > > ,
3535 pub destination_value : Option < Vec < u8 > > ,
3636}
37+
38+ /// Trait for resolving merge conflicts
39+ pub trait ConflictResolver {
40+ /// Resolve a conflict by returning the desired MergeResult
41+ /// Returns None if the conflict cannot be resolved and should remain as a conflict
42+ fn resolve_conflict ( & self , conflict : & MergeConflict ) -> Option < MergeResult > ;
43+ }
44+
45+ /// Default conflict resolver that ignores all conflicts (treats them as no-ops)
46+ #[ derive( Debug , Clone , Default ) ]
47+ pub struct IgnoreConflictsResolver ;
48+
49+ impl ConflictResolver for IgnoreConflictsResolver {
50+ fn resolve_conflict ( & self , conflict : & MergeConflict ) -> Option < MergeResult > {
51+ // Ignore conflicts by keeping the destination value (no change applied)
52+ // This effectively means "do nothing" for this key
53+ match & conflict. destination_value {
54+ Some ( value) => Some ( MergeResult :: Modified ( conflict. key . clone ( ) , value. clone ( ) ) ) ,
55+ None => Some ( MergeResult :: Removed ( conflict. key . clone ( ) ) ) ,
56+ }
57+ }
58+ }
59+
60+ /// Conflict resolver that always takes the source value
61+ #[ derive( Debug , Clone , Default ) ]
62+ pub struct TakeSourceResolver ;
63+
64+ impl ConflictResolver for TakeSourceResolver {
65+ fn resolve_conflict ( & self , conflict : & MergeConflict ) -> Option < MergeResult > {
66+ match & conflict. source_value {
67+ Some ( value) => Some ( MergeResult :: Modified ( conflict. key . clone ( ) , value. clone ( ) ) ) ,
68+ None => Some ( MergeResult :: Removed ( conflict. key . clone ( ) ) ) ,
69+ }
70+ }
71+ }
72+
73+ /// Conflict resolver that always takes the destination value
74+ #[ derive( Debug , Clone , Default ) ]
75+ pub struct TakeDestinationResolver ;
76+
77+ impl ConflictResolver for TakeDestinationResolver {
78+ fn resolve_conflict ( & self , conflict : & MergeConflict ) -> Option < MergeResult > {
79+ match & conflict. destination_value {
80+ Some ( value) => Some ( MergeResult :: Modified ( conflict. key . clone ( ) , value. clone ( ) ) ) ,
81+ None => Some ( MergeResult :: Removed ( conflict. key . clone ( ) ) ) ,
82+ }
83+ }
84+ }
0 commit comments