use std::path::PathBuf;
use clap::{Parser, ValueEnum};
use crate::rules::Severity;
#[derive(Parser, Debug)]
#[command(
name = "react-perf-analyzer",
version,
about = "React performance + security scanner. Single binary. Zero config.",
long_about = None
)]
pub struct Cli {
pub path: PathBuf,
#[arg(long, default_value = "text", value_name = "FORMAT")]
pub format: OutputFormat,
#[arg(long, value_name = "FILE")]
pub output: Option<PathBuf>,
#[arg(long, value_enum, default_value = "all", value_name = "CATEGORY")]
pub category: Category,
#[arg(long, value_enum, default_value = "none", value_name = "LEVEL")]
pub fail_on: FailOn,
#[arg(long, default_value_t = 300, value_name = "LINES")]
pub max_component_lines: usize,
#[arg(long, default_value_t = false)]
pub include_tests: bool,
#[arg(long, default_value_t = false)]
pub only_changed: bool,
#[arg(long, value_name = "FILE")]
pub baseline: Option<PathBuf>,
#[arg(long, value_name = "FILE")]
pub rules: Option<PathBuf>,
}
#[derive(ValueEnum, Clone, Debug, PartialEq)]
pub enum OutputFormat {
Text,
Json,
Html,
Sarif,
}
#[derive(ValueEnum, Clone, Debug, PartialEq, Default)]
pub enum Category {
#[default]
All,
Perf,
Security,
}
#[derive(ValueEnum, Clone, Debug, PartialEq)]
pub enum FailOn {
None,
Low,
Medium,
High,
Critical,
}
impl FailOn {
pub fn as_severity(&self) -> Option<Severity> {
match self {
FailOn::None => None,
FailOn::Low => Some(Severity::Low),
FailOn::Medium => Some(Severity::Medium),
FailOn::High => Some(Severity::High),
FailOn::Critical => Some(Severity::Critical),
}
}
}