starfeeds

I created this when I was started learning about gleam. It is a simple JSONFeed generator.

Try it out here: starfeeds - hexdocs

Example usage

import starfeeds/feed
import birl
import option
import simplifile

let posts = []

let feed_opts =
    feed.FeedOptions(
      id: "https://adediiji.uk/feed.json",
      title: "David Adediji",
      updated: option.Some(birl.now()),
      generator: option.Some("starfeeds by adediiji.uk"),
      language: option.Some("en-GB"),
      ttl: option.None,
      feed: option.None,
      feed_links: option.Some(feed.Link(
        href: "https://adediiji.uk/feed.json",
        rel: "self",
        link_type: "json",
        length: "",
      )),
      hub: option.None,
      docs: option.None,
      podcast: option.None,
      category: option.None,
      author: option.Some(feed.Author(
        name: option.Some("David Adediji"),
        url: option.Some("https://adediiji.uk"),
        avatar: option.Some("https://adediiji.uk/logo.png"),
      )),
      url: option.Some("https://adediiji.uk"),
      description: option.Some(""),
      image: option.Some("https://adediiji.uk/logo.png"),
      favicon: option.Some("https://adediiji.uk/favicon.ico"),
      copyright: option.Some("©" <> year <> " David Adediji"),
    )
  let json_feeed = feed.new_feed(feed_opts)
  
  let items =
    posts
    |> list.map(fn(post) {
      let path = post_path(post.relative_path)
      feed.Item(
        title: post.metadata.title,
        id: option.Some("https://adediiji.uk/" <> path),
        url: "https://adediiji.uk/" <> path,
        date: utils.string_to_date(post.metadata.date),
        description: option.Some(post.metadata.description),
        content: option.Some(content),
        category: option.Some([
          feed.Category(
            name: option.Some("Programming"),
            domain: option.None,
            scheme: option.None,
            term: option.None,
          ),
        ]),
        guid: option.None,
        image: option.Some("https://adediiji.uk/images/og.png"),
        audio: option.None,
        video: option.None,
        enclosure: option.None,
        author: option.Some([
          feed.Author(
            name: option.Some("David Adediji"),
            url: option.Some("https://adediiji.uk"),
            avatar: option.Some("https://adediiji.uk/logo.png"),
          ),
        ]),
        contributor: option.None,
        published: option.Some(utils.string_to_date(post.metadata.date)),
        copyright: option.Some("©" <> year <> " David Adediji"),
        extensions: [],
      )
    })

  let items = feed.add_item(json_feeed, items)
  let final_feed = feed.Feed(..json_feeed, items:)
  let content = feed.render_json(final_feed) |> json.to_string
  simplifile.write("dist/feed.json", content)
Usage example of starfeeds on adediiji.uk