mod layout;
mod resolve;
mod scan;
mod tenants;
use std::path::Path;
pub use scan::ScanFormat;
pub fn init_project(root: &Path) -> anyhow::Result<()> {
layout::ensure_layout(root)
}
pub fn scan_project(root: &Path, format: ScanFormat) -> anyhow::Result<()> {
let report = scan::scan(root)?;
scan::render_report(&report, format)
}
pub fn sync_project(root: &Path) -> anyhow::Result<()> {
resolve::resolve(root)
}
pub fn add_tenant(root: &Path, tenant: &str) -> anyhow::Result<()> {
tenants::add_tenant(root, tenant)
}
pub fn remove_tenant(root: &Path, tenant: &str) -> anyhow::Result<()> {
tenants::remove_tenant(root, tenant)
}
pub fn list_tenants(root: &Path) -> anyhow::Result<Vec<String>> {
tenants::list_tenants(root)
}
pub fn add_team(root: &Path, tenant: &str, team: &str) -> anyhow::Result<()> {
tenants::add_team(root, tenant, team)
}
pub fn remove_team(root: &Path, tenant: &str, team: &str) -> anyhow::Result<()> {
tenants::remove_team(root, tenant, team)
}
pub fn list_teams(root: &Path, tenant: &str) -> anyhow::Result<Vec<String>> {
tenants::list_teams(root, tenant)
}
fn ensure_dir(path: &Path) -> anyhow::Result<()> {
std::fs::create_dir_all(path)?;
Ok(())
}
fn write_if_missing(path: &Path, contents: &str) -> anyhow::Result<()> {
if path.exists() {
return Ok(());
}
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent)?;
}
std::fs::write(path, contents)?;
Ok(())
}