use anyhow::Result;
use clap::Parser;
mod check;
mod moonbit_parser;
mod parallel;
#[derive(Parser)]
#[command(name = "similarity-mbt")]
#[command(about = "MoonBit code similarity analyzer")]
#[command(version)]
struct Cli {
#[arg(default_value = ".")]
paths: Vec<String>,
#[arg(short, long)]
print: bool,
#[arg(short, long, default_value = "0.85")]
threshold: f64,
#[arg(short, long, value_delimiter = ',')]
extensions: Option<Vec<String>>,
#[arg(short, long, default_value = "3")]
min_lines: Option<u32>,
#[arg(long)]
min_tokens: Option<u32>,
#[arg(short, long, default_value = "0.3")]
rename_cost: f64,
#[arg(long)]
no_size_penalty: bool,
#[arg(long)]
filter_function: Option<String>,
#[arg(long)]
filter_function_body: Option<String>,
#[arg(long)]
no_fast: bool,
#[arg(long)]
fail_on_duplicates: bool,
}
fn main() -> Result<()> {
let cli = Cli::parse();
println!("Analyzing MoonBit code similarity...\n");
println!("=== Function Similarity ===");
let duplicate_count = check::check_paths(
cli.paths,
cli.threshold,
cli.rename_cost,
cli.extensions.as_ref(),
cli.min_lines.unwrap_or(3),
cli.min_tokens,
cli.no_size_penalty,
cli.print,
!cli.no_fast,
cli.filter_function.as_ref(),
cli.filter_function_body.as_ref(),
)?;
if cli.fail_on_duplicates && duplicate_count > 0 {
std::process::exit(1);
}
Ok(())
}