scf37 / config2

Config2 library

Version Matrix

config2

Build status Coverage Status

Config2 library

Usage:

resolvers += "Scf37" at "https://dl.bintray.com/scf37/maven/"
libraryDependencies += "me.scf37.config2" %% "config2" % "1.0.4"

Example:

class MongovConfig private (file: String) {

  def title = "MongoV - MongoDB viewer and editor"

  val env: String = Option(System.getenv("env"))
    .orElse(Option(System.getenv("HOSTNAME")))
    .getOrElse(InetAddress.getLocalHost.getHostName)

  println(s"Using environment $env")

  //look for config properties file in root classpath,
  //overriden by /$env/ folder on classpath,
  //overriden by /data/conf folder
  //additionally, override all values loaded from config file by env variables
  protected val source = Config.from(s"classpath:/")
    .overrideWith(s"classpath:/$env/")
    .overrideWith("/data/conf/")
    .overrideWith(System.getenv())

  val flags = new Flags(source.properties(file).get)

  val port = flags("web.port", "HTTP port to listen on", Some("8888"))(_.toInt)

  val bindAddress = flags("web.bindAddr", "IP interface to bind to", Some("0.0.0.0"))(v => v)

  val dev = flags("web.dev", "Development mode - includes /api endpoint, reloader and more", Some("true"))(_.toBoolean)

  val logRoot = flags("web.logRoot", "Root directory for log files", Some("."))(v => v)

  val logFileName = source.url("log4j2.xml").getOrElse {
    println("WARN: no log4j2.xml found")
    ""
  }
  println("Using log4j2 config at " + logFileName)
  System.setProperty("log4j.configurationFile", logFileName)
}

object Main {

  def main(args: Array[String]): Unit = {
    //load configuration
    val config = new MongovConfig("mongov")

    if (config.flags.errors.nonEmpty) {
      //we have config errors, print them, then print usage help, then exit.
      config.flags.errors.foreach { e =>
        println(e)
      }
      println(config.title)
      println(config.flags.usageString)
      System.exit(1)
    }

    //print configuration params in use
    println(config.title)
    println("Configuration:")
    config.flags.flags.foreach {f =>
      println(f.name + "=" + f.value)
    }
  }
  
  startApp(config)
}