poet 0.7.0

Static site generator with optional MCP server and LLM SEO optimizations
Documentation
use std::fmt;

use dashmap::DashMap;

#[derive(Default)]
pub struct AnyhowErrorAggregate {
    pub errors: DashMap<String, anyhow::Error>,
}

impl fmt::Display for AnyhowErrorAggregate {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        writeln!(
            formatter,
            "Multiple errors occurred ({} total):",
            self.errors.len()
        )?;

        for entry in self.errors.iter() {
            let key = entry.key();
            let error = entry.value();

            writeln!(formatter, "\n[{}]", key)?;
            writeln!(formatter, "{:#?}", error)?;
        }

        Ok(())
    }
}

#[cfg(test)]
mod tests {
    use anyhow::anyhow;

    use super::*;

    #[test]
    fn display_lists_every_aggregated_error() {
        let aggregate = AnyhowErrorAggregate::default();

        aggregate
            .errors
            .insert("first".to_string(), anyhow!("boom one"));
        aggregate
            .errors
            .insert("second".to_string(), anyhow!("boom two"));

        let rendered = aggregate.to_string();

        assert!(rendered.contains("(2 total)"));
        assert!(rendered.contains("[first]"));
        assert!(rendered.contains("[second]"));
    }

    #[test]
    fn display_reports_zero_when_empty() {
        assert!(
            AnyhowErrorAggregate::default()
                .to_string()
                .contains("(0 total)")
        );
    }
}