97 lines
3.0 KiB
Rust
97 lines
3.0 KiB
Rust
use atom_syndication::{Category, Content, Entry, Feed, Generator, Link, Person, Text, TextType};
|
|
|
|
use super::{Article, Post};
|
|
|
|
pub async fn atom(posts: Vec<Post<Article>>) -> Feed {
|
|
let me = Person {
|
|
name: "cel".into(),
|
|
email: Some("cel@blos.sm".into()),
|
|
uri: Some("https://blos.sm".into()),
|
|
};
|
|
let mut authors = Vec::new();
|
|
authors.push(me);
|
|
let link = Link {
|
|
href: "https://blos.sm/feed".into(),
|
|
rel: "self".into(),
|
|
hreflang: Some("en".into()),
|
|
mime_type: Some("application/atom+xml".into()),
|
|
title: Some("atom feed".into()),
|
|
length: None,
|
|
};
|
|
let mut links = Vec::new();
|
|
links.push(link);
|
|
let mut feed = Feed {
|
|
title: Text {
|
|
value: "cel's site".into(),
|
|
base: None,
|
|
lang: Some("en".into()),
|
|
r#type: TextType::Text,
|
|
},
|
|
id: "https://blos.sm".into(),
|
|
updated: posts[0].created_at.into(),
|
|
authors: authors.clone(),
|
|
categories: Vec::new(),
|
|
contributors: authors.clone(),
|
|
generator: Some(Generator {
|
|
value: "blos.sm".into(),
|
|
uri: Some("https://bunny.garden/cel/blos.sm".into()),
|
|
version: None,
|
|
}),
|
|
icon: Some("/icon.png".into()),
|
|
links: links.clone(),
|
|
logo: Some("/logo.png".into()),
|
|
rights: None,
|
|
subtitle: None,
|
|
entries: Vec::new(),
|
|
base: Some("https://blos.sm".into()),
|
|
lang: Some("en".into()),
|
|
..Default::default()
|
|
};
|
|
for mut post in posts {
|
|
post.render().await.unwrap_or_default();
|
|
let mut id = String::from("https://blos.sm/blog/");
|
|
id.push_str(&post.data.name);
|
|
let categories = post
|
|
.tags
|
|
.into_iter()
|
|
.map(|tag| Category {
|
|
term: tag.clone(),
|
|
scheme: None,
|
|
label: Some(tag.clone()),
|
|
})
|
|
.collect();
|
|
let entry = Entry {
|
|
title: Text {
|
|
value: post.subject.unwrap_or_default(),
|
|
base: None,
|
|
lang: Some("en".into()),
|
|
r#type: TextType::Text,
|
|
},
|
|
id: id.clone(),
|
|
updated: if let Some(updated_at) = post.updated_at {
|
|
updated_at.into()
|
|
} else {
|
|
post.created_at.into()
|
|
},
|
|
authors: authors.clone(),
|
|
categories,
|
|
contributors: authors.clone(),
|
|
links: links.clone(),
|
|
published: Some(post.created_at.into()),
|
|
rights: None,
|
|
source: None,
|
|
summary: None,
|
|
content: Some(Content {
|
|
base: None,
|
|
lang: Some("en".into()),
|
|
value: post.render,
|
|
src: Some(id),
|
|
content_type: Some("html".to_string()),
|
|
}),
|
|
..Default::default()
|
|
};
|
|
feed.entries.push(entry);
|
|
}
|
|
feed
|
|
}
|