How to use Scala 3 and scala-cli to read an array of values from a Typesafe HOCON file example

As a brief note today, this post includes an example that uses Scala 3, scala-cli, and a Typesafe HOCON configuration file. As a bit of an aside, I’m using Scala code like this to create “video” tags for the HTML files in my Scala 3 and ZIO 2 video training courses.

First, here’s the HOCON configuration file, which I named videos.conf:

videos = [
  {
    uri = "/video-course/functional-programming-2/a-small-zio-2-example-application/"
    name = "Video: Creating A Small Application with ZIO 2"
    description = "This video shows the basics of how to create a small application with ZIO 2 and Scala 3."
    thumbnailUrl = "https://alvinalexander.com/videos/courses/functional-programming-in-depth/240-ZIO-zMakeInt-Example.jpg"
    contentUrl = "https://alvinalexander.com/videos/courses/functional-programming-in-depth/240-ZIO-zMakeInt-Example.mp4"
    uploadDate = "2024-03-21T08:00:00+08:00"
  },
  {
    uri = "/video-course/advanced-scala-3/higher-order-functions-2/"
    name = "Video: Higher-Order Functions in Scala, Part 2"
    description = "A video on how to create and use higher-order functions in Scala 3, including functions like filter and map."
    thumbnailUrl = "https://alvinalexander.com/videos/courses/advanced-scala-3/001--Scala-HOFs--Part2-filter.jpg"
    contentUrl = "https://alvinalexander.com/videos/courses/advanced-scala-3/001--Scala-HOFs--Part2-filter.mp4"
    uploadDate = "2024-03-21T08:00:00+08:00"
  }
  // Add more video objects here...
]

Second, here’s the Scala 3 and scala-cli file I use to read that HOCON file:

//> using scala "3"
//> using dep "com.typesafe:config:1.4.3"

import com.typesafe.config.{Config, ConfigFactory}
import scala.jdk.CollectionConverters.*

case class Video(
    uri: String,
    name: String,
    description: String,
    thumbnailUrl: String,
    contentUrl: String,
    uploadDate: String
)

@main def ReadVideosConfiguration: Unit =

    val config: Config = ConfigFactory.load()
    val videosList = config.getConfigList("videos").asScala.toList

    val videos = videosList.map { videoConfig =>
        Video(
            uri = videoConfig.getString("uri"),
            name = videoConfig.getString("name"),
            description = videoConfig.getString("description"),
            thumbnailUrl = videoConfig.getString("thumbnailUrl"),
            contentUrl = videoConfig.getString("contentUrl"),
            uploadDate = videoConfig.getString("uploadDate")
        )
    }

Lastly, with that source code file named HoconVideos.scala, I run that code using this scala-cli command at my macOS Terminal command line:

scala-cli run HoconVideos.scala '-Dconfig.file=videos.conf'

When that runs I see this successful output:

Video: Video: Creating A Small Application with ZIO 2
    URI: /video-course/functional-programming-2/a-small-zio-2-example-application/
    Description: This video shows the basics of how to create a small application with ZIO 2 and Scala 3.
    Thumbnail: https://alvinalexander.com/videos/courses/functional-programming-in-depth/240-ZIO-zMakeInt-Example.jpg
    Content: https://alvinalexander.com/videos/courses/functional-programming-in-depth/240-ZIO-zMakeInt-Example.mp4
    Upload Date: 2024-03-21T08:00:00+08:00

Video: Video: Higher-Order Functions in Scala, Part 2
    URI: /video-course/advanced-scala-3/higher-order-functions-2/
    Description: A video on how to create and use higher-order functions in Scala 3, including functions like filter and map.
    Thumbnail: https://alvinalexander.com/videos/courses/advanced-scala-3/001--Scala-HOFs--Part2-filter.jpg
    Content: https://alvinalexander.com/videos/courses/advanced-scala-3/001--Scala-HOFs--Part2-filter.mp4
    Upload Date: 2024-03-21T08:00:00+08:00

So as a little summary, if you ever wanted to use Scala 3 and scala-cli to read a Typesafe HOCON configuration file, I hope this example is helpful.

Scala-CLI videos

If you’d like more information on Scala CLI, here are two videos where I show how to set it up and then use it: