io.specmatic.core.References.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of specmatic-core Show documentation
Show all versions of specmatic-core Show documentation
Turn your contracts into executable specifications. Contract Driven Development - Collaboratively Design & Independently Deploy MicroServices & MicroFrontends.
package io.specmatic.core
import io.specmatic.core.pattern.ContractException
data class ContractCache(private val executedContracts: MutableMap> = mutableMapOf()) {
fun update(path: String, fn: () -> Map): Map {
synchronized(this) {
val data = fn()
executedContracts[path] = data
return data
}
}
fun lookup(absolutePath: String): Map? {
return executedContracts[absolutePath]
}
}
data class References(val valueName: String, val contractFile: ContractFileWithExports, val baseURLs: Map = emptyMap(), private val variables: Map = emptyMap(), private val contractCache: ContractCache) {
fun lookup(key: String): String {
return fetchAndCache()[key] ?: throw ContractException("Key \"$key\" not found in value named $valueName")
}
private fun fetchAndCache(): Map =
contractCache.lookup(contractFile.absolutePath) ?: fetchAndUpdateContractCache()
private fun fetchAndUpdateContractCache(): Map = contractCache.update(contractFile.absolutePath) {
contractFile.runContractAndExtractExports(valueName, baseURLs, variables)
}
}