colored output, diffs

master
Mathias Rothenhaeusler 2023-08-02 19:57:49 +02:00
parent 1812caa171
commit 483d006181
4 changed files with 57 additions and 21 deletions

20
Cargo.lock generated
View File

@ -110,11 +110,23 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
[[package]]
name = "colored"
version = "2.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6"
dependencies = [
"is-terminal",
"lazy_static",
"windows-sys",
]
[[package]] [[package]]
name = "csvcompare" name = "csvcompare"
version = "0.1.0" version = "1.0.1"
dependencies = [ dependencies = [
"clap", "clap",
"colored",
] ]
[[package]] [[package]]
@ -161,6 +173,12 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.147" version = "0.2.147"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "csvcompare" name = "csvcompare"
version = "0.1.0" version = "1.0.1"
edition = "2018" edition = "2018"
description = "compare two files in csv format" description = "compare two files in csv format"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
@ -10,3 +10,4 @@ authors = ["Mathias Rothenhäusler <safemind@posteo.net"]
[dependencies] [dependencies]
clap = { version = "4.3.19", features = ["derive"] } clap = { version = "4.3.19", features = ["derive"] }
colored = "2.0.4"

View File

@ -1,3 +1,4 @@
use colored::Colorize;
use std::io::Write as IoWrite; use std::io::Write as IoWrite;
use std::{ use std::{
fs::File, fs::File,
@ -60,10 +61,24 @@ impl CsvLine {
} }
} }
pub fn print_lines(vector: Vec<CsvLine>) { pub fn print_lines(diff1: &[CsvLine], diff2: &[CsvLine], params: &Params) {
for line in vector.iter() { println!();
println!("{}", line.line); println!("{}", params.source);
} diff2
.iter()
.for_each(|line| println!("-- {}", line.line.red()));
diff1
.iter()
.for_each(|line| println!("++ {}", line.line.green()));
println!();
println!("{}", params.compared);
diff1
.iter()
.for_each(|line| println!("-- {}", line.line.red()));
diff2
.iter()
.for_each(|line| println!("++ {}", line.line.green()));
} }
pub fn write_to_file(filename: String, diff: Vec<CsvLine>) { pub fn write_to_file(filename: String, diff: Vec<CsvLine>) {
@ -90,15 +105,20 @@ pub fn compare(reader: BufReader<File>, reader2: BufReader<File>, params: &Param
}) })
.collect(); .collect();
let mut diff: Vec<CsvLine> = Vec::new(); let mut diff1: Vec<CsvLine> = find_diff(&vec1, &vec2, params);
let mut diff2: Vec<CsvLine> = find_diff(&vec2, &vec1, params);
find_diff(&vec1, &vec2, &mut diff, params); if params.output.is_none() {
find_diff(&vec2, &vec1, &mut diff, params); print_lines(&diff1, &diff2, params);
diff
} }
fn find_diff(vec1: &[CsvLine], vec2: &[CsvLine], diff: &mut Vec<CsvLine>, params: &Params) { diff1.append(&mut diff2);
diff1
}
fn find_diff(vec1: &[CsvLine], vec2: &[CsvLine], params: &Params) -> Vec<CsvLine> {
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]; let value = splitter[params.column];
@ -116,6 +136,8 @@ fn find_diff(vec1: &[CsvLine], vec2: &[CsvLine], diff: &mut Vec<CsvLine>, params
diff.push(CsvLine::new(i.line.parse().unwrap())); diff.push(CsvLine::new(i.line.parse().unwrap()));
} }
} }
diff
} }
#[cfg(test)] #[cfg(test)]

View File

@ -2,14 +2,16 @@ mod csv;
use std::fs::File; use std::fs::File;
use std::io::BufReader; use std::io::BufReader;
use clap::Parser; use clap::Parser;
use csv::compare; use csv::compare;
use crate::csv::compare::{Params, write_to_file, print_lines};
use crate::csv::args::MyArgs; use crate::csv::args::MyArgs;
use crate::csv::compare::{write_to_file, Params};
/// # Panics
///
/// Panics if delimter is set wrong and column to compare
/// is not available.
fn main() { fn main() {
let args = MyArgs::parse(); let args = MyArgs::parse();
@ -24,14 +26,7 @@ fn main() {
let diff = compare::compare(reader, reader2, &params); let diff = compare::compare(reader, reader2, &params);
let option_string_ref = params.output_mut(); let option_string_ref = params.output_mut();
// Now, check if the option is Some and dereference it to get the String
if let Some(string_ref) = option_string_ref { if let Some(string_ref) = option_string_ref {
// Clone the underlying String since process_string expects ownership
write_to_file(string_ref.clone(), diff); write_to_file(string_ref.clone(), diff);
// Alternatively, you can pass the ownership directly and consume the String
// process_string(string_ref);
} else {
print_lines(diff);
} }
} }