use std::path::PathBuf;
use anyhow::Result;
use clap::Args;
use tldr_core::patterns::format::format_pattern_report_text;
use tldr_core::{detect_patterns_with_config, Language, PatternCategory, PatternConfig};
use crate::output::{OutputFormat, OutputWriter};
#[derive(Debug, Args)]
pub struct PatternsArgs {
#[arg(default_value = ".")]
pub path: PathBuf,
#[arg(long, short = 'l')]
pub lang: Option<Language>,
#[arg(long, short = 'c', value_parser = parse_category)]
pub category: Option<PatternCategory>,
#[arg(long, default_value = "0.5")]
pub min_confidence: f64,
#[arg(long, default_value = "1000")]
pub max_files: usize,
#[arg(long)]
pub no_constraints: bool,
}
fn parse_category(s: &str) -> Result<PatternCategory, String> {
s.parse()
}
impl PatternsArgs {
pub fn run(&self, format: OutputFormat, quiet: bool) -> Result<()> {
let writer = OutputWriter::new(format, quiet);
writer.progress(&format!("Analyzing patterns in {}...", self.path.display()));
let config = PatternConfig {
min_confidence: self.min_confidence,
max_files: self.max_files,
evidence_limit: 3,
categories: self.category.map(|c| vec![c]).unwrap_or_default(),
generate_constraints: !self.no_constraints,
};
let report = detect_patterns_with_config(&self.path, self.lang, config)?;
if writer.is_text() {
let text = format_pattern_report_text(&report);
writer.write_text(&text)?;
} else {
writer.write(&report)?;
}
Ok(())
}
}