Skip to content

Commit 02db067

Browse files
Merge pull request #53 from codecov/joseph/add-error-info
feat: add buffer location to error message
2 parents 3348c31 + 3d4a26d commit 02db067

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

src/junit.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,31 @@ fn populate(
9191
pub fn parse_junit_xml(file_bytes: &[u8]) -> PyResult<ParsingInfo> {
9292
let mut reader = Reader::from_reader(file_bytes);
9393
reader.config_mut().trim_text(true);
94+
let thing = use_reader(&mut reader).map_err(|e| {
95+
let pos = reader.buffer_position();
96+
let (line, col) = get_position_info(file_bytes, pos.try_into().unwrap());
97+
ParserError::new_err(format!("Error at {}:{}: {}", line, col, e))
98+
})?;
99+
Ok(thing)
100+
}
101+
102+
fn get_position_info(input: &[u8], byte_offset: usize) -> (usize, usize) {
103+
let mut line = 1;
104+
let mut last_newline = 0;
105+
106+
for (i, &byte) in input.iter().take(byte_offset).enumerate() {
107+
if byte == b'\n' {
108+
line += 1;
109+
last_newline = i + 1;
110+
}
111+
}
112+
113+
let column = byte_offset - last_newline + 1;
114+
115+
(line, column)
116+
}
94117

118+
fn use_reader(reader: &mut Reader<&[u8]>) -> PyResult<ParsingInfo> {
95119
let mut testruns: Vec<Testrun> = Vec::new();
96120
let mut saved_testrun: Option<Testrun> = None;
97121

0 commit comments

Comments
 (0)