use std::path::PathBuf;
use clap::Subcommand;
use crate::catalog::scan::ScanMode;
#[derive(Subcommand)]
pub(crate) enum CatalogCommand {
Scan {
#[arg(long)]
root: Option<PathBuf>,
},
Graph {
#[arg(long)]
root: Option<PathBuf>,
},
}
pub(crate) fn dispatch(cmd: CatalogCommand, _color: bool) -> anyhow::Result<()> {
match cmd {
CatalogCommand::Scan { root } => run_catalog_scan(root),
CatalogCommand::Graph { root } => run_catalog_graph(root),
}
}
pub(crate) fn run_catalog_scan(root_arg: Option<PathBuf>) -> anyhow::Result<()> {
use std::io::Write;
let root = crate::root::find(root_arg, &crate::root::default_markers())?;
if !root.join(".doctrine").is_dir() {
anyhow::bail!("no .doctrine directory found at '{}'", root.display());
}
let catalog = crate::catalog::hydrate::scan_catalog(&root, ScanMode::default())?;
let json = serde_json::to_string_pretty(&catalog)
.map_err(|e| anyhow::anyhow!("failed to serialize catalog: {e}"))?;
write!(std::io::stdout(), "{json}")?;
Ok(())
}
pub(crate) fn run_catalog_graph(root_arg: Option<PathBuf>) -> anyhow::Result<()> {
use std::io::Write;
let root = crate::root::find(root_arg, &crate::root::default_markers())?;
if !root.join(".doctrine").is_dir() {
anyhow::bail!("no .doctrine directory found at '{}'", root.display());
}
let catalog = crate::catalog::hydrate::scan_catalog(&root, ScanMode::default())?;
let graph = crate::catalog::graph::CatalogGraph::from_catalog(&catalog);
let json = serde_json::to_string_pretty(&graph)
.map_err(|e| anyhow::anyhow!("failed to serialize graph: {e}"))?;
write!(std::io::stdout(), "{json}")?;
Ok(())
}
pub(crate) mod diagnostic;
pub(crate) mod graph;
pub(crate) mod hydrate;
pub(crate) mod scan;
#[cfg(test)]
pub(crate) mod test_helpers;