HOCON配置文件动态替换

时间:2018-08-23 06:45:23

标签: kotlin hocon

我正在使用HOCON来配置日志消息,并且正在寻找一种动态替换占位符值的方法。

我知道${?PLACEHOLDER}将读取一个环境变量,并且在PLACEHOLDER环境变量不存在时返回一个空字符串。

示例

这是我所想到的一个例子:

(我正在使用config4k加载HOCON)

data class LogMessage(val message: String, val code: String)

fun getMessage(key: String, placeholderValues: Array<String> = arrayOf()): LogMessage {
    val config = ConfigFactory.parseString("MY_LOG_MESSAGE {code = ABC-123456, message = My log message with dynamic value %0% and another dynamic value %1% }")

    val messageObject = config.extract<LogMessage>(key)
    var message = messageObject.message

    placeholderValues.forEachIndexed { placeholderIndex, value ->
        message = message.replace("%$placeholderIndex%", value)
    }

    return messageObject.copy(message = message)
}

fun main(args: Array<String>) {    
    println(getMessage("MY_LOG_MESSAGE", arrayOf("value 1", "value 2")))

    // prints: LogMessage(message=My log message with dynamic value value 1 and another dynamic value value 2, code=ABC-123456)
}

即使这可行,它也不是最佳解决方案,我认为已经有解决方案了。

有人可以告诉我是否有内置解决方案吗?

1 个答案:

答案 0 :(得分:0)

第一件事。
HOCON只是一种出色的JSON格式。 config4k只是一个包装器。
您可能已经注意到,Typesafe Config正在完成您的所有工作。
从他们的文档和代码来看,他们仅支持文件或环境中的占位符:

  

此库将自身限制为配置文件。如果要加载配置   从数据库之类的东西中,您将需要编写一些自定义   代码。

但是对于您正在做的事情,简单的distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip 就足够了:

String.format()

请注意,您可以使用fun interpolate(message: String, vararg args: Any) = String.format(message, *args) println(interpolate("My message was %s %s %s %s", "a", 1, 3.32, true)) // My message was a 1 3.32 true 来破坏数组。