//! Handler trait per ยง6.2. use std::fmt; use std::ops::Range; use std::path::Path; #[derive(Clone, Debug, PartialEq, Eq)] pub struct ConflictRegion { pub description: String, pub base: Range, pub ours: Range, pub theirs: Range, } #[derive(Clone, Debug)] pub enum MergeStatus { Merged { content: Vec, notes: Vec, }, Conflict { regions: Vec, partial: Vec, }, NotApplicable, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct MergeNote { pub message: String, } pub struct MergeResult { pub handler: String, pub status: MergeStatus, } impl fmt::Debug for MergeResult { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("MergeResult") .field("handler", &self.handler) .field("status", &short_status(&self.status)) .finish() } } fn short_status(s: &MergeStatus) -> &'static str { match s { MergeStatus::Merged { .. } => "Merged", MergeStatus::Conflict { .. } => "Conflict", MergeStatus::NotApplicable => "NotApplicable", } } /// Trait implemented by every handler in the cascade. pub trait MergeHandler: Send + Sync { fn name(&self) -> &str; fn applicable(&self, path: &Path, base: &[u8], ours: &[u8], theirs: &[u8]) -> bool; fn merge(&self, path: &Path, base: &[u8], ours: &[u8], theirs: &[u8]) -> MergeResult; }