This commit is contained in:
Matthieu Jolimaitre 2025-08-22 12:29:55 +02:00
commit 0f8550b517
21 changed files with 584 additions and 0 deletions

7
mousquetaire/Cargo.toml Normal file
View 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
View 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";