weaver_lib/tasks/
atom_feed_task.rs1use std::{collections::HashMap, sync::Arc};
2
3use async_trait::async_trait;
4use liquid::model::KString;
5use tokio::sync::Mutex;
6
7use crate::{
8    BuildError,
9    config::WeaverConfig,
10    document::Document,
11    filters::{has_key::HasKey, json::JSON},
12    renderers::{
13        WritableFile,
14        globals::{LiquidGlobals, LiquidGlobalsPage},
15    },
16};
17
18use super::WeaverTask;
19
20#[derive(Default)]
21pub struct AtomFeedTask;
22
23unsafe impl Send for AtomFeedTask {}
24unsafe impl Sync for AtomFeedTask {}
25
26#[async_trait]
27impl WeaverTask for AtomFeedTask {
28    async fn run(
29        &self,
30        config: Arc<WeaverConfig>,
31        content: &Arc<HashMap<KString, LiquidGlobalsPage>>,
32    ) -> Result<Option<WritableFile>, BuildError> {
33        let target = config.build_dir.clone();
34        let sitemap_template = include_str!("../templates/atom.xml.liquid");
35
36        let parser = liquid::ParserBuilder::with_stdlib()
37            .filter(JSON)
38            .filter(HasKey)
39            .build()
40            .unwrap();
41        let globals =
42            LiquidGlobals::new(Arc::new(Mutex::new(Document::default())), content, config).await;
43
44        match parser.parse(sitemap_template) {
45            Ok(parsed) => match parsed.render(&globals.to_liquid_data()) {
46                Ok(result) => Ok(Some(WritableFile {
47                    contents: result,
48                    path: format!("{}/atom.xml", &target).into(),
49                    emit: true,
50                })),
51                Err(err) => {
52                    eprintln!("Sitemap template rendering error {:#?}", &err);
53                    Err(BuildError::Err(err.to_string()))
54                }
55            },
56            Err(err) => {
57                eprintln!("Sitemap template rendering error {:#?}", &err);
58                Err(BuildError::Err(err.to_string()))
59            }
60        }
61    }
62}