towl 0.3.7

A fast CLI tool to scan codebases for TODO comments and output them in multiple formats
Documentation
use std::fmt;

use secrecy::ExposeSecret;

use super::types::TowlConfig;

fn fmt_list_section(
    f: &mut fmt::Formatter<'_>,
    label: &str,
    items: &[String],
    is_last: bool,
) -> fmt::Result {
    let branch = if is_last {
        "│  └─"
    } else {
        "│  ├─"
    };
    writeln!(f, "{branch} {label}:")?;
    let (mid, end) = if is_last {
        ("│     ├─", "│     └─")
    } else {
        ("│  │  ├─", "│  │  └─")
    };
    for (i, item) in items.iter().enumerate() {
        let prefix = if i == items.len() - 1 { end } else { mid };
        writeln!(f, "{prefix} {item}")?;
    }
    Ok(())
}

impl fmt::Display for TowlConfig {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        writeln!(f, "Towl Configuration")?;
        writeln!(f, "┌─ Parsing")?;
        let mut sorted_extensions: Vec<_> = self.parsing.file_extensions.iter().collect();
        sorted_extensions.sort();
        writeln!(
            f,
            "│  ├─ File Extensions: {}",
            sorted_extensions
                .iter()
                .map(|s| s.as_str())
                .collect::<Vec<_>>()
                .join(", ")
        )?;
        writeln!(
            f,
            "│  ├─ Exclude Patterns: {}",
            self.parsing.exclude_patterns.join(", ")
        )?;
        writeln!(
            f,
            "│  ├─ Context Lines: {}",
            self.parsing.include_context_lines
        )?;
        fmt_list_section(f, "Comment Prefixes", &self.parsing.comment_prefixes, false)?;
        fmt_list_section(f, "TODO Patterns", &self.parsing.todo_patterns, false)?;
        fmt_list_section(
            f,
            "Function Patterns",
            &self.parsing.function_patterns,
            true,
        )?;
        writeln!(f, "└─ GitHub")?;
        writeln!(f, "   ├─ Owner: {}", self.github.owner)?;
        writeln!(f, "   ├─ Repo: {}", self.github.repo)?;
        writeln!(
            f,
            "   ├─ Token: {}",
            if self.github.token.expose_secret().is_empty() {
                "not set"
            } else {
                "configured"
            }
        )?;
        write!(
            f,
            "   └─ Rate Limit Delay: {}ms",
            self.github.rate_limit_delay_ms
        )
    }
}