RSS 2.0 and Atom 1.0 feed generation library
moon add tkancf/feed_gen///|
let item = @feed_gen.FeedItem::new(
"First Post",
description="This is the summary of my first post.",
)
.set_content(Some("<p>This is the full post.</p>"))
.set_url(Some("https://example.com/posts/first"))
.set_pub_date(Some(@feed_gen.FeedDate::utc(2026, 6, 27, hour=12)))
///|
let config = @feed_gen.FeedConfig::new(
"My Blog",
"A blog about technology and programming",
"https://example.com",
items=[item],
)
.set_feed_url(Some("https://example.com/rss.xml"))
.set_last_build_date(Some(@feed_gen.FeedDate::utc(2026, 6, 27, hour=12)))
.set_author(Some(@feed_gen.Author::new("Jane Doe", email="jane@example.com")))
///|
let rss = config.to_xml(indent=true).unwrap()
///|
let atom = config.to_atom(indent=true).unwrap()moon run cmd/main///|
let config = @feed_gen.FeedConfig::new(
"My Feed", "Feed description", "https://example.com",
)///|
let item = @feed_gen.FeedItem::new(
"Article",
description="Short summary",
)
.set_content(Some("<p>Full HTML content.</p>"))
.set_url(Some("https://example.com/article"))
.set_guid(Some("article-1"))
.set_pub_date(Some(@feed_gen.FeedDate::utc(2026, 6, 27)))///|
let xml = config.to_xml(indent=true).unwrap()///|
let xml = config.to_atom(indent=true).unwrap()///|
let newest_first = config.sort_by(fn(a, b) {
match (a.pub_date(), b.pub_date()) {
(Some(x), Some(y)) => y.compare(x)
(Some(_), None) => -1
(None, Some(_)) => 1
(None, None) => a.title().compare(b.title())
}
})///|
let utc = @feed_gen.FeedDate::utc(2026, 6, 27, hour=12, minute=30)
///|
let jst = @feed_gen.FeedDate::new(
2026,
6,
27,
hour=21,
minute=30,
offset_minutes=540,
)///|
let episode = @feed_gen.FeedItem::new(
"Episode 1",
description="The first episode",
)
.set_enclosure(
Some(
@feed_gen.FeedEnclosure::new(
"https://example.com/media/episode-1.m4a", 12_345_678L,
),
),
)///|
let image = @feed_gen.FeedImage::new(
"https://example.com/logo.png",
"Example Feed",
"https://example.com",
)
.set_width(Some(144))
.set_height(Some(144))
.set_description(Some("Feed artwork"))
///|
let config = @feed_gen.FeedConfig::new(
"Example Feed",
"A feed with artwork",
"https://example.com",
)
.set_image(Some(image))///|
let config = @feed_gen.FeedConfig::new("Podcast", "A show", "https://example.com")
.add_custom_namespace("itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd")
.add_custom_element(@feed_gen.Text("itunes:author", "Jane Doe"))
.add_custom_element(@feed_gen.Element("itunes:owner", [], [
@feed_gen.Text("itunes:name", "Jane Doe"),
@feed_gen.Text("itunes:email", "jane@example.com"),
]))pub suberror FeedError {
InvalidTag(String)
MissingRequiredField(String)
InvalidAttrName(String)
DuplicateNamespacePrefix(String)
ReservedNamespacePrefix(String)
DuplicateAttrName(String)
InvalidValue(String)
InvalidEnclosure(String)
InvalidGeo(String)
InvalidDate(String)
} derive(Compare, Eq, Debug)pub struct FeedConfig {
title : String
description : String
feed_url : String?
site_url : String
author : Author?
categories : Array[FeedCategory]
pub_date : FeedDate?
last_build_date : FeedDate?
image : FeedImage?
hub : String?
docs : String?
copyright : String?
language : String?
managing_editor : String?
web_master : String?
ttl : Int?
generator : String
custom_namespaces : Array[(String, String)]
custom_elements : Array[CustomElement]
items : Array[FeedItem]
} derive(Compare, Eq, Debug)fn FeedConfig::new(title : String, description : String, site_url : String, items? : Array[FeedItem]) -> FeedConfigpub struct FeedItem {
title : String
description : String?
content : String?
url : String?
guid : String?
guid_is_perma_link : Bool?
categories : Array[FeedCategory]
author : Author?
pub_date : FeedDate?
lat : Double?
long : Double?
enclosure : FeedEnclosure?
custom_elements : Array[CustomElement]
} derive(Compare, Eq, Debug)RSS 2.0 and Atom 1.0 feed generation library