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()))
}
}
}
}