setu-cli 0.1.6

A quick markdown link checker
Documentation
use std::process;

use colored::Colorize;
use futures::future::join_all;

use clap::Parser;
use setu_cli::{MarkdownCheckResult, get_markdowns, parse_markdown};

#[derive(Parser, Debug)]
#[command(name = "setu")]
#[command(author, version, about = "Setu checks markdown for broken links", long_about = None)]
struct SetuArgs {
    #[arg(default_value = ".")]
    target_path: String,

    #[arg(short, long, default_value = "false")]
    view_all: bool,

    #[arg(short, long, value_delimiter = ',', default_value = "404")]
    concerns: Option<Vec<u16>>,

    #[arg(short, long)]
    strict: bool,
}

#[tokio::main]
async fn main() {
    let setu_args = SetuArgs::parse();

    let paths = get_markdowns(&setu_args.target_path);

    let tasks = paths
        .iter()
        .map(|path| parse_markdown(path, &setu_args.concerns));

    let results: Vec<MarkdownCheckResult> = join_all(tasks).await;

    for result in &results {
        println!("{}\n", result.display_with_config(setu_args.view_all));
    }

    let malformed_links = results
        .into_iter()
        .filter(|md| md.success)
        .flat_map(|res| res.checks)
        .filter(|check| check.status.is_broken())
        .count()
        > 0;

    if malformed_links {
        println!("{}", "Scan complete. Broken links detected".red().bold());

        if setu_args.strict {
            process::exit(1)
        }
    } else {
        println!("{}", "Scan complete. All links healthy!".green().bold());
    }
}