From 43a25a8ec926f41f8362b4c8221939a3f99605ed Mon Sep 17 00:00:00 2001 From: mace Date: Thu, 3 Aug 2023 22:04:40 +0200 Subject: [PATCH] added some types, optimize error handling --- src/csv/compare.rs | 19 +++++++++++-------- src/main.rs | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/csv/compare.rs b/src/csv/compare.rs index c327db2..8650126 100644 --- a/src/csv/compare.rs +++ b/src/csv/compare.rs @@ -88,7 +88,7 @@ pub fn write_to_file(filename: String, diff: Vec) { } } -pub fn compare(reader: BufReader, reader2: BufReader, params: &Params) -> Vec { +pub fn compare(reader: BufReader, reader2: BufReader, params: &Params) -> Result, String> { let vec1: Vec = reader .lines() .map(|line| { @@ -105,8 +105,8 @@ pub fn compare(reader: BufReader, reader2: BufReader, params: &Param }) .collect(); - let mut diff1: Vec = find_diff(&vec1, &vec2, params); - let mut diff2: Vec = find_diff(&vec2, &vec1, params); + let mut diff1: Vec = find_diff(&vec1, &vec2, params)?; + let mut diff2: Vec = find_diff(&vec2, &vec1, params)?; if params.output.is_none() { print_lines(&diff1, &diff2, params); @@ -114,14 +114,17 @@ pub fn compare(reader: BufReader, reader2: BufReader, params: &Param diff1.append(&mut diff2); - diff1 + Ok(diff1) } -fn find_diff(vec1: &[CsvLine], vec2: &[CsvLine], params: &Params) -> Vec { +fn find_diff(vec1: &[CsvLine], vec2: &[CsvLine], params: &Params) -> Result, String> { let mut diff: Vec = Vec::new(); for i in vec1.iter() { let splitter: Vec<&str> = i.line.split(params.delimiter()).collect(); - let value = splitter[params.column]; + if splitter.len() <= params.column { + return Err("Column out of bound".to_string()); + } + let value: &str = splitter[params.column]; let found = !matches!( vec2.iter().position(|r| { @@ -137,7 +140,7 @@ fn find_diff(vec1: &[CsvLine], vec2: &[CsvLine], params: &Params) -> Vec = compare(file1, file2, ¶ms); + let result: Vec = compare(file1, file2, ¶ms).unwrap(); assert_eq!(3, result.len()); } } diff --git a/src/main.rs b/src/main.rs index 48cd814..8234fbe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,17 +15,41 @@ use crate::csv::compare::{write_to_file, Params}; fn main() { let args = MyArgs::parse(); - let mut params = Params::new_from_matches(args); + let mut params: Params = Params::new_from_matches(args); - let file = File::open(params.source()).expect("Can't find source file"); - let file2 = File::open(params.compared()).expect("Cant't find compared file"); + let file: File = { + let this = File::open(params.source()); + match this { + Ok(file) => file, + Err(e) => { + eprintln!("Can't find source file: {}", e); + return; + } + } + }; + let file2 = { + let this = File::open(params.compared()); + match this { + Ok(file) => file, + Err(e) => { + eprintln!("Cant't find compared file: {}", e); + return; + } + } + }; - let reader = BufReader::new(file); - let reader2 = BufReader::new(file2); + let reader: BufReader = BufReader::new(file); + let reader2: BufReader = BufReader::new(file2); - let diff = compare::compare(reader, reader2, ¶ms); + let diff: Vec = match compare::compare(reader, reader2, ¶ms) { + Ok(d) => d, + Err(e) => { + eprintln!("{e}"); + return; + } + }; - let option_string_ref = params.output_mut(); + let option_string_ref: &Option = params.output_mut(); if let Some(string_ref) = option_string_ref { write_to_file(string_ref.clone(), diff); }