0

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! ;)

iammyr
  • 271
  • 5
  • 13

1 Answers1

2
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.

hussachai
  • 4,322
  • 2
  • 16
  • 17