added some types, optimize error handling

master
Mathias Rothenhaeusler 2023-08-03 22:04:40 +02:00
parent 483d006181
commit 43a25a8ec9
2 changed files with 42 additions and 15 deletions

View File

@ -88,7 +88,7 @@ pub fn write_to_file(filename: String, diff: Vec<CsvLine>) {
} }
} }
pub fn compare(reader: BufReader<File>, reader2: BufReader<File>, params: &Params) -> Vec<CsvLine> { pub fn compare(reader: BufReader<File>, reader2: BufReader<File>, params: &Params) -> Result<Vec<CsvLine>, String> {
let vec1: Vec<CsvLine> = reader let vec1: Vec<CsvLine> = reader
.lines() .lines()
.map(|line| { .map(|line| {
@ -105,8 +105,8 @@ pub fn compare(reader: BufReader<File>, reader2: BufReader<File>, params: &Param
}) })
.collect(); .collect();
let mut diff1: Vec<CsvLine> = find_diff(&vec1, &vec2, params); let mut diff1: Vec<CsvLine> = find_diff(&vec1, &vec2, params)?;
let mut diff2: Vec<CsvLine> = find_diff(&vec2, &vec1, params); let mut diff2: Vec<CsvLine> = find_diff(&vec2, &vec1, params)?;
if params.output.is_none() { if params.output.is_none() {
print_lines(&diff1, &diff2, params); print_lines(&diff1, &diff2, params);
@ -114,14 +114,17 @@ pub fn compare(reader: BufReader<File>, reader2: BufReader<File>, params: &Param
diff1.append(&mut diff2); diff1.append(&mut diff2);
diff1 Ok(diff1)
} }
fn find_diff(vec1: &[CsvLine], vec2: &[CsvLine], params: &Params) -> Vec<CsvLine> { fn find_diff(vec1: &[CsvLine], vec2: &[CsvLine], params: &Params) -> Result<Vec<CsvLine>, String> {
let mut diff: Vec<CsvLine> = Vec::new(); let mut diff: Vec<CsvLine> = Vec::new();
for i in vec1.iter() { for i in vec1.iter() {
let splitter: Vec<&str> = i.line.split(params.delimiter()).collect(); 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!( let found = !matches!(
vec2.iter().position(|r| { vec2.iter().position(|r| {
@ -137,7 +140,7 @@ fn find_diff(vec1: &[CsvLine], vec2: &[CsvLine], params: &Params) -> Vec<CsvLine
} }
} }
diff Ok(diff)
} }
#[cfg(test)] #[cfg(test)]
@ -167,7 +170,7 @@ mod test {
column: 1, column: 1,
output: Some("./assets/result.csv".to_owned()), output: Some("./assets/result.csv".to_owned()),
}; };
let result: Vec<CsvLine> = compare(file1, file2, &params); let result: Vec<CsvLine> = compare(file1, file2, &params).unwrap();
assert_eq!(3, result.len()); assert_eq!(3, result.len());
} }
} }

View File

@ -15,17 +15,41 @@ use crate::csv::compare::{write_to_file, Params};
fn main() { fn main() {
let args = MyArgs::parse(); 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 file: File = {
let file2 = File::open(params.compared()).expect("Cant't find compared 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 reader: BufReader<File> = BufReader::new(file);
let reader2 = BufReader::new(file2); let reader2: BufReader<File> = BufReader::new(file2);
let diff = compare::compare(reader, reader2, &params); let diff: Vec<compare::CsvLine> = match compare::compare(reader, reader2, &params) {
Ok(d) => d,
Err(e) => {
eprintln!("{e}");
return;
}
};
let option_string_ref = params.output_mut(); let option_string_ref: &Option<String> = params.output_mut();
if let Some(string_ref) = option_string_ref { if let Some(string_ref) = option_string_ref {
write_to_file(string_ref.clone(), diff); write_to_file(string_ref.clone(), diff);
} }