Skip to content

Add Evidence-Based Getters for play.api.Configuration Instances #8

@michaelahlers

Description

@michaelahlers

The API around Configuration is inflexible. Proposed additions:

import com.typesafe.config.ConfigFactory
import play.api.Configuration

import scala.concurrent.duration._

val configuration =
  Configuration(ConfigFactory.parseString(
    """
      |string: string
      |number: 10
      |duration: 10 hours
    """.stripMargin
  ))

trait ConfigurationReader[T] {
  def read(c: Configuration, path: String): Option[T]
}

implicit case object StringReader extends ConfigurationReader[String] {
  override def read(c: Configuration, path: String): Option[String] = c.getString(path)
}

implicit case object DurationReader extends ConfigurationReader[Duration] {
  override def read(c: Configuration, path: String): Option[Duration] = c.getString(path).map(Duration(_))
}

def get[T](c: Configuration, path: String)(implicit r: ConfigurationReader[T]): Option[T] = r.read(c, path)

assert(get[String](configuration, "string") == configuration.getString("string"))
assert(get[Duration](configuration, "duration").contains(10 hours))

Error handling is TBD.

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions