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}