queue-ast-hop 0.4.0

Static queue dependency graph for BullMQ and glide-mq
Documentation
pub(crate) use no_mistakes_core::cli::Format;
use no_mistakes_core::cli::{edge_view, root_scoped_edge_depth};
use no_mistakes_core::queue::{Edge, ProjectReport};
use serde::Serialize;

pub(crate) fn print_edges(
    report: &ProjectReport,
    roots: &[String],
    depth: Option<usize>,
    format: Format,
) -> anyhow::Result<()> {
    let depth = root_scoped_edge_depth(roots, depth);
    let edges = edge_view(&report.edges, roots, depth);
    match format {
        Format::Json => {
            println!("{}", serde_json::to_string_pretty(&edges)?);
            Ok(())
        }
        Format::Yml => {
            println!("{}", serde_yaml::to_string(&edges)?);
            Ok(())
        }
        Format::Paths => {
            for edge in &edges {
                println!("{}", edge.to);
            }
            Ok(())
        }
        Format::Md => {
            println!("# Queue edges");
            for edge in &edges {
                println!("- `{}` -> `{}` ({})", edge.from, edge.to, edge.kind);
            }
            Ok(())
        }
        Format::Human => {
            if roots.is_empty() {
                println!("queue edges");
            } else {
                println!("{}", roots.join(", "));
            }
            for edge in &edges {
                println!("  {} -> {}", edge.from, edge.to);
            }
            Ok(())
        }
    }
}

pub(crate) fn print_related(
    roots: &[String],
    edges: &[Edge],
    format: Format,
) -> anyhow::Result<()> {
    #[derive(Serialize)]
    struct Related<'a> {
        roots: &'a [String],
        edges: &'a [Edge],
    }
    match format {
        Format::Json => {
            println!(
                "{}",
                serde_json::to_string_pretty(&Related { roots, edges })?
            );
        }
        Format::Yml => {
            println!("{}", serde_yaml::to_string(&Related { roots, edges })?);
        }
        Format::Paths => {
            for edge in edges {
                println!("{}", edge.to);
            }
        }
        Format::Md => {
            println!("# Related queue files");
            for edge in edges {
                println!("- `{}` -> `{}`", edge.from, edge.to);
            }
        }
        Format::Human => {
            println!("{}", roots.join(", "));
            for edge in edges {
                println!("  {} -> {}", edge.from, edge.to);
            }
        }
    }
    Ok(())
}

pub(crate) fn print_check(report: &ProjectReport, format: Format) -> anyhow::Result<()> {
    match format {
        Format::Json => println!("{}", serde_json::to_string_pretty(&report.check)?),
        Format::Yml => println!("{}", serde_yaml::to_string(&report.check)?),
        Format::Paths => {
            for finding in &report.check {
                println!("{}", finding.file);
            }
        }
        Format::Md => {
            println!("# Queue check");
            for finding in &report.check {
                println!("- `{}`:{} {}", finding.file, finding.line, finding.message);
            }
        }
        Format::Human => {
            for finding in &report.check {
                println!(
                    "{}[{}] {}:{} {}",
                    finding.kind,
                    finding.job.as_deref().unwrap_or("*"),
                    finding.file,
                    finding.line,
                    finding.message
                );
            }
        }
    }
    Ok(())
}