(cols: &[DataCol], file_path: &str)
| 535 | } |
| 536 | |
| 537 | fn validate_csv(cols: &[DataCol], file_path: &str) -> Result<(), Box<dyn Error>> { |
| 538 | // file handle and reader |
| 539 | let file = File::open(file_path)?; |
| 540 | let mut reader = csv::Reader::from_reader(file); |
| 541 | let mut line: u32 = 1; |
| 542 | |
| 543 | // Collect intended headers |
| 544 | let mut intended_headers: Vec<String> = vec![]; |
| 545 | for col in cols { |
| 546 | intended_headers.push(col.name.to_string()) |
| 547 | } |
| 548 | // Validate headers |
| 549 | if let Err(err) = validate_headers(&mut reader, intended_headers) { |
| 550 | return Err(From::from(err)); |
| 551 | } |
| 552 | |
| 553 | // Check each result, return read errors |
| 554 | for result in reader.records() { |
| 555 | line += 1; |
| 556 | match result { |
| 557 | Err(err) => return Err(From::from(err)), |
| 558 | Ok(record) => { |
| 559 | if let Err(err) = validate_record(record, line, cols) { |
| 560 | return Err(From::from(err)); |
| 561 | }; |
| 562 | } |
| 563 | } |
| 564 | } |
| 565 | return Ok(()); |
| 566 | } |
| 567 | |
| 568 | fn validate_headers( |
| 569 | reader: &mut csv::Reader<std::fs::File>, |
no test coverage detected