linecheck 1.1.0

A fast, configurable tool that warns or errors when files exceed a set line count
Documentation
mod args;
mod display;

use anyhow::Result;
use args::Args;
use clap::Parser;
use display::{print_json, print_status, print_violations};
use linecheck::{
    checker::CheckOptions, config::ConfigResolver, files::collect_files, preset::Preset,
};

fn main() -> Result<()> {
    let args = Args::parse();
    let mut resolver = ConfigResolver::new(args.config_path(), "linecheck.yml");
    let preset = args
        .strict
        .then_some(Preset::Strict)
        .or(args.default_preset.then_some(Preset::Default))
        .or(args.loose.then_some(Preset::Loose))
        .or(args.free.then_some(Preset::Free));
    let (fallback_warn, fallback_error) = preset.map(|p: Preset| p.limits()).unwrap_or((
        Some(linecheck::preset::DEFAULT_WARN),
        Some(linecheck::preset::DEFAULT_ERROR),
    ));
    let opts = CheckOptions {
        max_lines: args.max_lines,
        fallback_warn,
        fallback_error,
    };
    let root_cfg = resolver.resolve(&std::env::current_dir().unwrap_or_default().join("__"));
    let files = collect_files(
        &args.paths,
        &root_cfg
            .as_ref()
            .map(|c| c.exclude.clone())
            .unwrap_or_default(),
    );
    let mut has_error = false;
    if args.json {
        print_json(&files, &mut resolver, &opts, args.status, &mut has_error);
    } else if args.status {
        print_status(&files, &mut resolver, &opts, &mut has_error);
    } else {
        print_violations(&files, &mut resolver, &opts, &mut has_error);
    }
    if has_error {
        std::process::exit(1);
    }
    Ok(())
}