use clap::Subcommand;
#[derive(Debug, Subcommand)]
pub(crate) enum PublicationCommand {
Validate,
}
pub(crate) fn run_publication_validate() -> anyhow::Result<()> {
use crate::publication::{EmbeddedAdapter, PublicationManifest, Resolver};
use std::io::Write;
let resolver = Resolver::new(PublicationManifest::load()?, EmbeddedAdapter);
let entries = resolver.manifest().entries();
let count = entries.len();
let plural = if count == 1 { "y" } else { "ies" };
let mut stdout = std::io::stdout();
writeln!(
stdout,
"publication validate: {count} entr{plural} declared"
)?;
let mut sink = std::io::sink();
let mut failures: Vec<String> = Vec::new();
for entry in entries {
match resolver.emit(entry.address(), &mut sink) {
Ok(()) => writeln!(stdout, " ok {}", entry.report_line())?,
Err(err) => {
writeln!(stdout, " FAIL {} — {err}", entry.address().as_str())?;
failures.push(entry.address().as_str().to_string());
}
}
}
if !failures.is_empty() {
anyhow::bail!(
"publication validate: {} of {count} entr{plural} failed to resolve/emit: {}",
failures.len(),
failures.join(", ")
);
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn run_publication_validate_admits_shipped_manifest() {
run_publication_validate().expect("shipped manifest validates");
}
}