weaver-lib 0.3.0

static site generator as a library, markdown and liquid in, HTML out.
Documentation
use std::{collections::HashMap, sync::Arc};

use async_trait::async_trait;
use liquid::model::KString;
use tokio::sync::Mutex;

use crate::{
    BuildError,
    config::WeaverConfig,
    document::Document,
    filters::{has_key::HasKey, json::JSON},
    renderers::{
        WritableFile,
        globals::{LiquidGlobals, LiquidGlobalsPage},
    },
};

use super::WeaverTask;

#[derive(Default)]
pub struct SiteMapTask;

unsafe impl Send for SiteMapTask {}
unsafe impl Sync for SiteMapTask {}

#[async_trait]
impl WeaverTask for SiteMapTask {
    async fn run(
        &self,
        config: Arc<WeaverConfig>,
        content: &Arc<HashMap<KString, LiquidGlobalsPage>>,
    ) -> Result<Option<WritableFile>, BuildError> {
        let target = config.build_dir.clone();
        let sitemap_template = include_str!("../templates/sitemap.xml.liquid");

        let parser = liquid::ParserBuilder::with_stdlib()
            .filter(JSON)
            .filter(HasKey)
            .build()
            .unwrap();
        let globals =
            LiquidGlobals::new(Arc::new(Mutex::new(Document::default())), content, config).await;

        match parser.parse(sitemap_template) {
            Ok(parsed) => match parsed.render(&globals.to_liquid_data()) {
                Ok(result) => Ok(Some(WritableFile {
                    contents: result,
                    path: format!("{}/sitemap.xml", &target).into(),
                    emit: true,
                })),
                Err(err) => {
                    eprintln!("Sitemap template rendering error {:#?}", &err);
                    Err(BuildError::Err(err.to_string()))
                }
            },
            Err(err) => {
                eprintln!("Sitemap template rendering error {:#?}", &err);
                Err(BuildError::Err(err.to_string()))
            }
        }
    }
}