iammyr
iammyr

Reputation: 271

Iterate through complex Scala collections loaded from config file

I've read other threads on SO about iterating through collections from config files in Scala but they always assume the type in question is either a ConfigList or an ObjectList. In my case it is a more complex structure and I could not figure out how to access its elements.

In my config file I need to have a group of tuples without being too finicky on the collection type. For instance, I'm open to use a List of tuples or a Map[String, List], etc. Like the following (from application.conf):

myprogr {
   groupsOfSomeStuff
   {
      group_1 -> {
        name = "name1",
        url = "url1",
        something = "whatever"
      },
      ...,
      group_n -> {
        name = "namen",
        url = "urln",
        something = "whatever"
      }
   }
}

At the moment with the conf file above, I can only print the whole groupsOfSomeStuff but I can not access any of its individual elements:

var conf = ConfigFactory.load()
println(conf.getObject("myprogr.groupsOfSomeStuff"))

which returns:

SimpleConfigObject({"group_1 ->":{"something":"whatever","name":"name1","url":"url1"}, ..., "group_n ->":{"something":"whatever","name":"namen","url":"urln"})

If I try to print conf.getObjectList or conf.getConfList I get an error at run time cause what gets extracted from the conf file is not a list but an object. The same happens if I substitute the "->" in the conf file with ":" or with "=" (since as I wrote, I'm open to different types of collections).

If I try to assign conf.getObject("myprogr.groupsOfSomeStuff") to a var of type SimpleConfigObject (with the intention of iterate through the elements of its "value" Map attribute), I get a compile-time error "SimpleConfigObject is not accessible from this position".

How can I iterate through the group_1, ..., group_n elements and individually access the name, url and something parts of each entry's value?

Thanks a million in advance! ;)

Upvotes: 0

Views: 885

Answers (1)

hussachai
hussachai

Reputation: 4472

object TestConfig extends App {
  import scala.collection.JavaConverters._
  case class Foo(name: String, url: String, something: String)
  val config = ConfigFactory.parseResources("test.conf")
  val path = "myprogr.groupsOfSomeStuff"
  val fooList: List[Foo] = config.getObject(path).keySet().asScala.map { key =>
    val member = config.getObject(s"$path.$key").toConfig
    Foo(member.getString("name"), member.getString("url"), member.getString("something"))
  }.toList
  println(fooList)
}

It should print List(Foo(name1,url1,whatever), Foo(namen,urln,whatever)) I hope this is what you are trying to do.

Upvotes: 2

Related Questions