如何从主函数隐藏配置管理?

时间:2017-10-20 11:31:55

标签: scala functional-programming pureconfig

我有这样的切入点:

def main(args: Array[String]): Unit = {
  pureconfig.loadConfig[Conf] match {
    case Right(conf) => doStuff(conf)
    case Left(fail) => lectureUserAboutStuff(fail)
  }
}

所以看起来我的程序的主要目的是加载配置,这不是真的,我的程序的核心是doStuff

如何明确地表示这一点并隐藏秘密配置?

我想要这样的事情:

def main(args: Array[String]): Unit = {
  doStuff(conf)(failHandler)
}

其中很清楚,故障处理和配置加载只是附件。

1 个答案:

答案 0 :(得分:1)

从程序的main方法中使用PureConfig的最常用方法之一是在出错时快速失败。 API提供loadConfigOrThrow,如果加载成功则返回配置,否则抛出ConfigReaderException

import pureconfig.loadConfigOrThrow

def main(args: Array[String]): Unit = {
  val conf = loadConfigOrThrow[Conf] // will throw if Conf cannot be loaded
  doStuff(conf)
}

pureconfig.loadConfig返回Either的原因是因为 加载配置可能会失败。 Either模拟了失败 案例,Left,成功案例Right。这是 适合图书馆,因为你永远不知道loadConfig 将被调用,因此你不想抛出一个 例外。虽然这是正确的,但loadConfig是 从“表面”方法中使用,例如, main,抛出异常或 只是在配置加载失败的情况下退出是有意义的 这就是pureconfig提供loadConfigOrThrow

的原因

如果您不喜欢抛出异常或者您更喜欢自定义 失败处理程序,如lectureUserAboutStuff,您可以创建一个 助手:

def loadConfig(): Option[Conf] = {
  val errorOrConf = pureconfig.loadConfig[Conf]
  errorOrConf.left.foreach(lectureUserAboutStuff)
  errorOrConf.toOption
}

def main(args: Array[String]): Unit =
  loadConfig().foreach(doStuff)

要记住的最后一件事是这个问题的一个小问题 代码是应用程序的退出代码不受影响 配置失败。如果要为何时设置退出代码 无法加载配置,然后将main更改为

val configReaderFailureErrorCode = 42

private def configFailureExit() =
  sys.exit(configReaderFailureErrorCode)

def main(args: Array[String]): Unit =
  loadConfig().fold(configFailureExit())(doStuff)