package com.romangraef.jrconfig import com.romangraef.jrconfig.variables.IntegerVariable import com.romangraef.jrconfig.variables.StringVariable typealias ConfigVariableProvider = (ConfigProvider, String) -> ConfigVariable object Config { private var configProvider: ConfigProvider? = null private val map: MutableMap, ConfigVariableProvider<*>> = mutableMapOf() private val proxyProvider: ConfigProvider = object : ConfigProvider { override fun provideData(point: String): String? = configProvider?.provideData(point) override fun setData(point: String, data: String) = configProvider?.setData(point, data) ?: Unit } init { map[Int::class.java] = ::IntegerVariable map[String::class.java] = ::StringVariable } @Suppress("UNCHECKED_CAST") @JvmStatic fun get(clazz: Class, point: String): ConfigVariable { return (map[clazz] as? ConfigVariableProvider)?.invoke(proxyProvider, point) ?: throw ConfigMissingProviderException(clazz) } inline fun get(point: String) = get(T::class.java, point) @JvmStatic fun registerConfigVariableProvider(clazz: Class, provider: ConfigVariableProvider) { map[clazz] = provider } inline fun registerConfigVariableProvider(noinline provider: ConfigVariableProvider) = registerConfigVariableProvider(T::class.java, provider) @JvmStatic fun use(provider: ConfigProvider?) { configProvider = provider } @JvmStatic fun getString(point: String): ConfigVariable { return get(String::class.java, point) } }