Skip to content

Commit 19840f2

Browse files
mrewoolfg
authored andcommitted
Work on merge setup
1 parent 42ca666 commit 19840f2

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
)]
1414

1515
mod git;
16+
mod merge;
1617
mod parser;
1718
mod quartiles;
1819
mod types;
1920

2021
pub use crate::git::count_commits;
22+
pub use crate::merge::Merger;
2123
pub use crate::parser::Parser;

src/merge.rs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
use std::convert::TryFrom;
2+
3+
use crate::{parser::ParseState, types::Timeline};
4+
use anyhow::Result;
5+
6+
/// Merger merges multiple timelines into one
7+
#[derive(Debug)]
8+
pub struct Merger {
9+
state: ParseState,
10+
}
11+
12+
impl Merger {
13+
/// Create a new merger with a clean state (no timeline merged)
14+
pub fn new() -> Self {
15+
let state = ParseState::default();
16+
Merger { state }
17+
}
18+
19+
fn merge_single(&mut self, single: ParseState) -> Result<()> {
20+
self.state = single;
21+
Ok(())
22+
}
23+
24+
/// Merge multiple timelines together into one
25+
/// This is helpful when analyzing multiple repositories and trying to combine
26+
/// the individual results.
27+
pub fn merge(&mut self, timelines: &[Timeline]) -> Result<Timeline> {
28+
for timeline in timelines {
29+
let single = ParseState::try_from(timeline.clone())?;
30+
self.merge_single(single)?;
31+
}
32+
Ok(Timeline::try_from(&self.state)?)
33+
}
34+
}
35+
36+
#[cfg(test)]
37+
mod test {
38+
use super::*;
39+
use crate::types::{Contribution, Range, Year};
40+
41+
#[test]
42+
fn test_merge_none() {
43+
let mut merger = Merger::new();
44+
assert_eq!(merger.merge(&[]).unwrap(), Timeline::default());
45+
}
46+
47+
#[test]
48+
fn test_merge_one() {
49+
let mut timeline = Timeline::default();
50+
51+
let year = "2020".into();
52+
let total = 1234;
53+
let range = Range {
54+
start: "2020-02-01".into(),
55+
end: "2020-03-02".into(),
56+
};
57+
58+
let year1 = Year { year, total, range };
59+
let years = vec![year1];
60+
timeline.years = years;
61+
62+
let contributions = vec![
63+
Contribution {
64+
date: "2020-01-01".into(),
65+
count: 1000,
66+
color: "".into(),
67+
intensity: 4,
68+
},
69+
Contribution {
70+
date: "2020-01-02".into(),
71+
count: 234,
72+
color: "".into(),
73+
intensity: 4,
74+
},
75+
];
76+
77+
timeline.contributions = contributions;
78+
79+
let mut merger = Merger::new();
80+
assert_eq!(merger.merge(&[timeline.clone()]).unwrap(), timeline);
81+
}
82+
}

0 commit comments

Comments
 (0)