Skip to content

Instantly share code, notes, and snippets.

@eungju
Last active April 1, 2024 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eungju/948da8da58d352c1ff222cc438d612ee to your computer and use it in GitHub Desktop.
Save eungju/948da8da58d352c1ff222cc438d612ee to your computer and use it in GitHub Desktop.
Kotlin Embedded Config
open class DeploymentEnvironment<T : Any>(
val base: T,
vararg val profiles: Pair<String, (T) -> T>
) {
companion object {
fun <T : Any> config(clazz: Class<T>, name: String, profiles: Iterable<String> = emptyList()): T {
return (Class.forName(clazz.`package`.name + "." + name).kotlin.objectInstance as DeploymentEnvironment<T>)
.config(profiles)
}
}
fun config(profiles: Iterable<String> = emptyList()): T =
profiles.fold(base) { config, profile ->
this.profiles.first { it.first == profile }.second(config)
}
}
data class FooConfig(
val name: String,
val value: Int
)
object dev : DeploymentEnvironment<FooConfig>(
FooConfig("dev", 1),
"p2" to { config: FooConfig -> config.copy(value = 2) },
"p3" to { config: FooConfig -> config.copy(value = 3) }
)
class DeploymentEnvironmentTest {
@Test
fun config() {
assertEquals(
dev.base,
DeploymentEnvironment.get(FooConfig::class.java, "dev")
)
}
@Test
fun profileOverrideConfig() {
assertEquals(
dev.base.let(dev.profiles[0].second),
DeploymentEnvironment.get(FooConfig::class.java, "dev", listOf("p2"))
)
}
@Test
fun laterProfileOverridePrior() {
assertEquals(
dev.base.let(dev.profiles[0].second).let(dev.profiles[1].second),
DeploymentEnvironment.get(FooConfig::class.java, "dev", listOf("p2", "p3"))
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment