Skip to main content

suture_driver/
strategy.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2/// Merge strategy selected based on file size.
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum MergeStrategy {
5    /// Full semantic merge — best for small files where precision matters most.
6    FullSemantic,
7    /// Merge at key-path level only — good for medium files.
8    KeyPathOnly,
9    /// Section-based merge — for very large files where full analysis is costly.
10    SectionBased,
11}
12
13/// Select an optimal merge strategy based on file size.
14///
15/// These thresholds are heuristics and can be tuned per use-case.
16///
17/// # Thresholds
18///
19/// | Size | Strategy |
20/// |------|----------|
21/// | < 1 KiB | `FullSemantic` |
22/// | < 100 KiB | `KeyPathOnly` |
23/// | >= 100 KiB | `SectionBased` |
24pub fn optimal_merge_strategy(file_size: usize) -> MergeStrategy {
25    if file_size < 1024 {
26        MergeStrategy::FullSemantic
27    } else if file_size < 100_000 {
28        MergeStrategy::KeyPathOnly
29    } else {
30        MergeStrategy::SectionBased
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn test_small_file() {
40        assert_eq!(optimal_merge_strategy(512), MergeStrategy::FullSemantic);
41    }
42
43    #[test]
44    fn test_boundary_small() {
45        assert_eq!(optimal_merge_strategy(1023), MergeStrategy::FullSemantic);
46    }
47
48    #[test]
49    fn test_medium_file() {
50        assert_eq!(optimal_merge_strategy(2048), MergeStrategy::KeyPathOnly);
51    }
52
53    #[test]
54    fn test_boundary_medium() {
55        assert_eq!(optimal_merge_strategy(99_999), MergeStrategy::KeyPathOnly);
56    }
57
58    #[test]
59    fn test_large_file() {
60        assert_eq!(optimal_merge_strategy(100_000), MergeStrategy::SectionBased);
61    }
62
63    #[test]
64    fn test_very_large_file() {
65        assert_eq!(optimal_merge_strategy(10_000_000), MergeStrategy::SectionBased);
66    }
67
68    #[test]
69    fn test_zero_size() {
70        assert_eq!(optimal_merge_strategy(0), MergeStrategy::FullSemantic);
71    }
72}