init
This commit is contained in:
commit
0f8550b517
21 changed files with 584 additions and 0 deletions
7
mousquetaire/Cargo.toml
Normal file
7
mousquetaire/Cargo.toml
Normal file
|
@ -0,0 +1,7 @@
|
|||
[package]
|
||||
name = "mousquetaire"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
mousquet = { path = "../mousquet" }
|
61
mousquetaire/src/main.rs
Normal file
61
mousquetaire/src/main.rs
Normal file
|
@ -0,0 +1,61 @@
|
|||
use std::{env::args, fs};
|
||||
|
||||
use mousquet::lang::Span;
|
||||
|
||||
pub struct Args {
|
||||
file_a: String,
|
||||
file_b: String,
|
||||
}
|
||||
|
||||
impl Args {
|
||||
pub fn parse() -> Self {
|
||||
let [_, file_a, file_b] = args()
|
||||
.collect::<Vec<_>>()
|
||||
.try_into()
|
||||
.expect("Usage: mousquet <file_a> <file_b>");
|
||||
Self { file_a, file_b }
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let Args { file_a, file_b } = Args::parse();
|
||||
let source_a = fs::read_to_string(&file_a).unwrap();
|
||||
let source_b = fs::read_to_string(&file_b).unwrap();
|
||||
let similarities = mousquet::similarity(mousquet::lang::PYTHON, &source_a, &source_b);
|
||||
|
||||
let mut similarities_in_a: Vec<_> = similarities.token_matches.iter().map(|s| s.0.clone()).collect();
|
||||
let mut similarities_in_b: Vec<_> = similarities.token_matches.iter().map(|s| s.1.clone()).collect();
|
||||
similarities_in_a.sort_by_key(|s| s.start);
|
||||
similarities_in_b.sort_by_key(|s| s.start);
|
||||
println!();
|
||||
print_file_with_similarities(file_a, source_a, similarities_in_a);
|
||||
print_file_with_similarities(file_b, source_b, similarities_in_b);
|
||||
}
|
||||
|
||||
fn print_file_with_similarities(file_name: String, file_content: String, sorted_similarities: Vec<Span>) {
|
||||
println!("┌────────────────────────────────────────");
|
||||
println!("│ File '{file_name}':");
|
||||
println!("├────────────────────────────────────────");
|
||||
print!("│");
|
||||
let mut prev_end = 0;
|
||||
for sim in sorted_similarities {
|
||||
let before = &file_content[prev_end..sim.start];
|
||||
let inside = &file_content[sim.start..sim.end];
|
||||
prev_end = sim.end;
|
||||
print_formatted_text(before, "│ ", (BLUE, RESET));
|
||||
print_formatted_text(inside, "│ ", (YELLOW, RESET));
|
||||
}
|
||||
print_formatted_text(&file_content[prev_end..], "│ ", (BLUE, RESET));
|
||||
println!();
|
||||
println!("└────────────────────────────────────────");
|
||||
}
|
||||
|
||||
fn print_formatted_text(text: &str, prefix: &str, color: (&str, &str)) {
|
||||
let (col_start, col_end) = color;
|
||||
let prefixed = text.replace("\n", &format!("{col_end}\n{prefix}{col_start}"));
|
||||
print!("{col_start}{prefixed}{col_end}");
|
||||
}
|
||||
|
||||
const YELLOW: &str = "\x1b[0;33m";
|
||||
const BLUE: &str = "\x1b[0;34m";
|
||||
const RESET: &str = "\x1b[0m";
|
Loading…
Add table
Add a link
Reference in a new issue