Skip to content

Commit 33c5a27

Browse files
committed
Merge remote-tracking branch 'origin/feature/upgrade_combine'
2 parents 563676f + 5e421ec commit 33c5a27

File tree

6 files changed

+164
-54
lines changed

6 files changed

+164
-54
lines changed

Cargo.lock

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ documentation = "http://holyshared.github.io/lcov-parser/lcov_parser/index.html"
1111
readme = "README.md"
1212

1313
[dependencies]
14-
combine = "2.3.*"
14+
combine = "2.4.*"
1515

1616
[dev-dependencies]
1717
tempdir = "0.3"

src/macros.rs

+18
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,21 @@ macro_rules! impl_try_merge {
5959
}
6060
};
6161
}
62+
63+
#[macro_export]
64+
macro_rules! impl_from_error {
65+
($from:ty, $dest:ident::$item:ident) => {
66+
impl ::std::convert::From<$from> for $dest {
67+
fn from(error: $from) -> Self {
68+
$dest::$item(error)
69+
}
70+
}
71+
};
72+
($from:ty, $nest_dest:ident::$nest_item:ident=>$dest:ident::$item:ident) => {
73+
impl From<$from> for MergeError {
74+
fn from(error: $from) -> Self {
75+
$dest::$item($nest_dest::$nest_item(error))
76+
}
77+
}
78+
}
79+
}

src/merger/merger.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,7 @@ mod tests {
150150
let mut parse = ReportMerger::new();
151151
let result = parse.merge(&[ report_path, report_path ]).unwrap_err();
152152

153-
let checksum_error = ChecksumError::Empty(MergeLine {
154-
line: 6,
155-
checksum: None
156-
});
153+
let checksum_error = ChecksumError::Empty(MergeLine::new(6, None));
157154
let test_error = TestError::from(checksum_error);
158155

159156
// see pull request

src/merger/mod.rs

+22
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,28 @@ use std::path::Path;
1515
use report::*;
1616
use self::ops::MergeError;
1717

18+
/// Merge reports
19+
///
20+
/// # Examples
21+
///
22+
/// ```
23+
/// use lcov_parser::merge_files;
24+
///
25+
/// let trace_files = [
26+
/// "tests/fixtures/merge/fixture.info",
27+
/// "tests/fixtures/merge/fixture.info"
28+
/// ];
29+
/// let _ = match merge_files(&trace_files) {
30+
/// Ok(report) => {
31+
/// let result = report.save_as("/tmp/merged_report.info");
32+
/// match result {
33+
/// Ok(_) => println!("saved"),
34+
/// Err(err) => println!("{}", err)
35+
/// }
36+
/// },
37+
/// Err(err) => println!("{}", err)
38+
/// };
39+
/// ```
1840
pub fn merge_files<T: AsRef<Path>>(files: &[T]) -> Result<Report, MergeError> {
1941
let mut merger = ReportMerger::new();
2042
merger.merge(files)

src/merger/ops/mod.rs

+119-46
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use std::result::Result;
1010
use std::convert::From;
1111
use std::io:: { Error as IOError};
12+
use std::fmt;
1213
use parser:: { ParseError, RecordParseError };
1314
use record:: { BranchData };
1415
use report::line:: { Line };
@@ -32,10 +33,44 @@ pub enum ChecksumError {
3233
Mismatch(MergeLine, MergeLine)
3334
}
3435

36+
impl fmt::Display for ChecksumError {
37+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
38+
match self {
39+
&ChecksumError::Empty(ref line) => {
40+
write!(f, "No source code checksum: {}", line)
41+
},
42+
&ChecksumError::Mismatch(ref line1, ref line2) => {
43+
write!(f, "Source code checksums do not match: line: {}, left: {}, right: {}",
44+
line1.line(),
45+
line1.checksum(),
46+
line2.checksum())
47+
}
48+
}
49+
}
50+
}
51+
3552
#[derive(Debug, PartialEq)]
3653
pub struct MergeLine {
37-
pub line: LineNumber,
38-
pub checksum: Option<CheckSum>
54+
line: LineNumber,
55+
checksum: Option<CheckSum>
56+
}
57+
58+
impl MergeLine {
59+
pub fn new(line_number: LineNumber, checksum: Option<CheckSum>) -> MergeLine {
60+
MergeLine {
61+
line: line_number,
62+
checksum: checksum
63+
}
64+
}
65+
pub fn line(&self) -> &LineNumber {
66+
&self.line
67+
}
68+
pub fn checksum(&self) -> &str {
69+
match self.checksum {
70+
Some(ref checksum) => checksum.as_str(),
71+
None => &""
72+
}
73+
}
3974
}
4075

4176
impl<'a> From<&'a Line> for MergeLine {
@@ -45,10 +80,13 @@ impl<'a> From<&'a Line> for MergeLine {
4580
Some(value) => Some(value.clone()),
4681
None => None
4782
};
48-
MergeLine {
49-
line: line_number,
50-
checksum: checksum
51-
}
83+
MergeLine::new(line_number, checksum)
84+
}
85+
}
86+
87+
impl fmt::Display for MergeLine {
88+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
89+
write!(f, "line: {}, checksum: {}", self.line(), self.checksum())
5290
}
5391
}
5492

@@ -57,6 +95,16 @@ pub enum FunctionError {
5795
Mismatch(FunctionName, FunctionName)
5896
}
5997

98+
impl fmt::Display for FunctionError {
99+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
100+
match self {
101+
&FunctionError::Mismatch(ref func1, ref func2) => {
102+
write!(f, "Function name mismatch: left = {}, right = {}", func1, func2)
103+
}
104+
}
105+
}
106+
}
107+
60108
#[derive(Debug, PartialEq)]
61109
pub struct MergeBranch {
62110
pub line: LineNumber,
@@ -87,35 +135,47 @@ impl<'a> From<&'a BranchData> for MergeBranch {
87135
}
88136
}
89137

138+
impl fmt::Display for MergeBranch {
139+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
140+
write!(f, "line:{} block:{} branch:{}", self.line, self.block, self.branch)
141+
}
142+
}
143+
90144
#[derive(Debug, PartialEq)]
91145
pub enum BranchError {
92146
Mismatch(MergeBranch, MergeBranch)
93147
}
94148

149+
impl fmt::Display for BranchError {
150+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
151+
match self {
152+
&BranchError::Mismatch(ref branch1, ref branch2) => {
153+
write!(f, "Branch mismatch: left = {}, right = {}", branch1, branch2)
154+
}
155+
}
156+
}
157+
}
158+
95159
#[derive(Debug, PartialEq)]
96160
pub enum TestError {
97161
Checksum(ChecksumError),
98162
Function(FunctionError),
99163
Branch(BranchError)
100164
}
101165

102-
impl From<ChecksumError> for TestError {
103-
fn from(error: ChecksumError) -> Self {
104-
TestError::Checksum(error)
166+
impl fmt::Display for TestError {
167+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
168+
match self {
169+
&TestError::Checksum(ref err) => write!(f, "{}", err),
170+
&TestError::Function(ref err) => write!(f, "{}", err),
171+
&TestError::Branch(ref err) => write!(f, "{}", err)
172+
}
105173
}
106174
}
107175

108-
impl From<FunctionError> for TestError {
109-
fn from(error: FunctionError) -> Self {
110-
TestError::Function(error)
111-
}
112-
}
113-
114-
impl From<BranchError> for TestError {
115-
fn from(error: BranchError) -> Self {
116-
TestError::Branch(error)
117-
}
118-
}
176+
impl_from_error!(ChecksumError, TestError::Checksum);
177+
impl_from_error!(FunctionError, TestError::Function);
178+
impl_from_error!(BranchError, TestError::Branch);
119179

120180
#[derive(Debug)]
121181
pub enum MergeError {
@@ -124,29 +184,10 @@ pub enum MergeError {
124184
Process(TestError)
125185
}
126186

127-
impl From<IOError> for MergeError {
128-
fn from(error: IOError) -> Self {
129-
MergeError::IO(error)
130-
}
131-
}
132-
133-
impl From<ChecksumError> for MergeError {
134-
fn from(error: ChecksumError) -> Self {
135-
MergeError::Process(TestError::Checksum(error))
136-
}
137-
}
138-
139-
impl From<FunctionError> for MergeError {
140-
fn from(error: FunctionError) -> Self {
141-
MergeError::Process(TestError::Function(error))
142-
}
143-
}
144-
145-
impl From<BranchError> for MergeError {
146-
fn from(error: BranchError) -> Self {
147-
MergeError::Process(TestError::Branch(error))
148-
}
149-
}
187+
impl_from_error!(IOError, MergeError::IO);
188+
impl_from_error!(ChecksumError, TestError::Checksum=>MergeError::Process);
189+
impl_from_error!(FunctionError, TestError::Function=>MergeError::Process);
190+
impl_from_error!(BranchError, TestError::Branch=>MergeError::Process);
150191

151192
impl From<ParseError> for MergeError {
152193
fn from(error: ParseError) -> Self {
@@ -157,8 +198,40 @@ impl From<ParseError> for MergeError {
157198
}
158199
}
159200

160-
impl From<TestError> for MergeError {
161-
fn from(error: TestError) -> Self {
162-
MergeError::Process(error)
201+
impl_from_error!(TestError, MergeError::Process);
202+
203+
impl fmt::Display for MergeError {
204+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
205+
match self {
206+
&MergeError::IO(ref err) => write!(f, "{}", err),
207+
&MergeError::RecordParse(ref err) => write!(f, "{}", err),
208+
&MergeError::Process(ref err) => write!(f, "{}", err)
209+
}
210+
}
211+
}
212+
213+
214+
215+
#[cfg(test)]
216+
mod tests {
217+
use merger::ops:: { MergeError, TestError, ChecksumError, MergeLine };
218+
219+
#[test]
220+
fn merge_error_of_checksum_empty() {
221+
let merge_line = MergeLine::new(1, None);
222+
let checksum_error = ChecksumError::Empty(merge_line);
223+
let test_error = TestError::from(checksum_error);
224+
let merge_error = MergeError::from(test_error);
225+
assert_eq!(merge_error.to_string(), "No source code checksum: line: 1, checksum: ")
226+
}
227+
228+
#[test]
229+
fn merge_error_of_checksum() {
230+
let merge_line1 = MergeLine::new(1, Some("xyz".to_string()));
231+
let merge_line2 = MergeLine::new(1, Some("zzz".to_string()));
232+
let checksum_error = ChecksumError::Mismatch(merge_line1, merge_line2);
233+
let test_error = TestError::from(checksum_error);
234+
let merge_error = MergeError::from(test_error);
235+
assert_eq!(merge_error.to_string(), "Source code checksums do not match: line: 1, left: xyz, right: zzz")
163236
}
164237
}

0 commit comments

Comments
 (0)