ferrocat 2.2.0

Rust-first gettext and ICU toolkit for PO parsing, catalog updates, and MessageFormat parsing.
Documentation
use ferrocat::{CatalogAuditOptions, NormalizedParsedCatalog, ParseCatalogOptions, audit_catalogs};

fn catalog(
    content: &str,
    locale: &str,
) -> Result<NormalizedParsedCatalog, Box<dyn std::error::Error>> {
    Ok(
        ferrocat::parse_catalog(ParseCatalogOptions::new(content, "en").with_locale(locale))?
            .into_normalized_view()?,
    )
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let source = catalog("msgid \"Checkout\"\nmsgstr \"Checkout\"\n", "en")?;
    let target = catalog("msgid \"Checkout\"\nmsgstr \"\"\n", "de")?;

    let report = audit_catalogs(&[&source, &target], &CatalogAuditOptions::new("en"))?;

    assert!(report.has_errors());
    assert!(
        report
            .diagnostics
            .iter()
            .any(|diagnostic| diagnostic.code == "catalog.empty_translation")
    );

    for diagnostic in &report.diagnostics {
        println!("{}: {}", diagnostic.code, diagnostic.message);
    }

    Ok(())
}