yar_site 0.10.0

Library for creating and working with static sites for yar.
Documentation
use minijinja::{Value, value::ViaDeserialize};

use crate::page::Page;

#[allow(clippy::needless_pass_by_value)]
pub fn pages_in_section(
    section_name: String,
    pages: ViaDeserialize<Vec<Page>>,
) -> minijinja::Value {
    let section_pages = pages.iter().filter(|page| {
        page.path.parent().is_some_and(|path| {
            path.file_name()
                .is_some_and(|name| name == section_name.as_str())
        })
    });

    Value::from_serialize(section_pages.collect::<Vec<&Page>>())
}

#[cfg(test)]
mod tests {
    use color_eyre::Result;
    use minijinja::Environment;
    use url::Url;
    use yar_markdown::MarkdownRenderer;

    use super::*;

    #[test]
    fn test_pages_in_section() -> Result<()> {
        let pages = (0..10)
            .collect::<Vec<_>>()
            .iter()
            .map(|n| {
                format!(
                    r#"
---
title = "post-{n}"
tags = ["foo"]
template = "page.html"
date = "2025-01-01T6:00:00"
updated = "2025-03-12T8:00:00"
---

Hello World
        "#
                )
            })
            .enumerate()
            .map(|(n, s)| {
                Page::new(
                    format!("site/_content/series/testing/post-{n}.md"),
                    &s,
                    "hashplaceholder".to_string(),
                    "public/",
                    "site/",
                    &Url::parse("https://example.com")?,
                    &MarkdownRenderer::new::<&str>(None, None)?,
                    &Environment::empty(),
                )
            })
            .collect::<Result<Vec<Page>>>()?;

        let found = pages_in_section(
            "testing".to_string(),
            minijinja::value::ViaDeserialize(pages),
        );
        insta::assert_yaml_snapshot!(found);

        Ok(())
    }
}