diff options
Diffstat (limited to 'src/main/kotlin/com/romangraef/jrconfig')
13 files changed, 122 insertions, 22 deletions
diff --git a/src/main/kotlin/com/romangraef/jrconfig/Config.kt b/src/main/kotlin/com/romangraef/jrconfig/Config.kt index 7641689..47b8bae 100644 --- a/src/main/kotlin/com/romangraef/jrconfig/Config.kt +++ b/src/main/kotlin/com/romangraef/jrconfig/Config.kt @@ -1,25 +1,29 @@ package com.romangraef.jrconfig -import com.romangraef.jrconfig.variables.IntegerVariable -import com.romangraef.jrconfig.variables.StringVariable +import com.romangraef.jrconfig.variables.* -typealias ConfigVariableProvider<T> = (ConfigProvider, String) -> ConfigVariable<T> +typealias ConfigVariableProvider<T> = (ConfigSaveLoadProvider, String) -> ConfigVariable<T> object Config { - private var configProvider: ConfigProvider? = null + private var configProvider = mutableListOf<ConfigProvider>() private val map: MutableMap<Class<*>, ConfigVariableProvider<*>> = mutableMapOf() - private val proxyProvider: ConfigProvider = object : ConfigProvider { + private val proxyProvider: ConfigSaveLoadProvider = object : ConfigSaveLoadProvider { override fun provideData(point: String): String? = - configProvider?.provideData(point) + configProvider.map { it.provideData(point) }.firstOrNull() - override fun setData(point: String, data: String) = - configProvider?.setData(point, data) ?: Unit + override fun setData(point: String, data: String): Boolean = + configProvider.asSequence().mapNotNull { it as? ConfigSaveLoadProvider }.map { it.setData(point, data) } + .firstOrNull() ?: false + } init { + map[Double::class.java] = ::DoubleVariable + map[Float::class.java] = ::FloatVariable map[Int::class.java] = ::IntegerVariable + map[Long::class.java] = ::LongVariable map[String::class.java] = ::StringVariable } @@ -31,7 +35,13 @@ object Config { ?: throw ConfigMissingProviderException(clazz) } + @JvmStatic + fun <T : Enum<T>> getEnum(enumClass: Class<T>, point: String): ConfigVariable<T> { + return EnumVariable(enumClass, proxyProvider, point) + } + inline fun <reified T> get(point: String) = get(T::class.java, point) + inline fun <reified T : Enum<T>> getEnum(point: String) = getEnum(T::class.java, point) @JvmStatic fun <T> registerConfigVariableProvider(clazz: Class<T>, provider: ConfigVariableProvider<T>) { @@ -43,8 +53,13 @@ object Config { @JvmStatic - fun use(provider: ConfigProvider?) { - configProvider = provider + fun use(provider: ConfigProvider) { + configProvider.add(provider) + } + + @JvmStatic + fun useFirst(provider: ConfigProvider) { + configProvider.add(0, provider) } @JvmStatic diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt index 019cdef..8873c56 100644 --- a/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt +++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt @@ -2,5 +2,4 @@ package com.romangraef.jrconfig interface ConfigProvider { fun provideData(point: String): String? - fun setData(point: String, data: String) }
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigSaveLoadProvider.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigSaveLoadProvider.kt new file mode 100644 index 0000000..5085c2f --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigSaveLoadProvider.kt @@ -0,0 +1,5 @@ +package com.romangraef.jrconfig + +interface ConfigSaveLoadProvider : ConfigProvider { + fun setData(point: String, data: String): Boolean +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt index 8a9d375..c0ade39 100644 --- a/src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt +++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt @@ -7,4 +7,5 @@ interface ConfigVariable<T> { fun set(value: T) operator fun getValue(thisRef: Any?, property: KProperty<*>) = get() operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) = set(value) + fun defaultValue(t: T?): ConfigVariable<T> }
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/DefaultConfigVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/DefaultConfigVariable.kt new file mode 100644 index 0000000..661a0f6 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/DefaultConfigVariable.kt @@ -0,0 +1,12 @@ +package com.romangraef.jrconfig + +class DefaultConfigVariable<T>(private val internal: ConfigVariable<T>, private val default: T) : ConfigVariable<T> { + override fun get(): T = try { + internal.get() + } catch (e: Exception) { + default + } + + override fun set(value: T): Unit = internal.set(value) + override fun defaultValue(t: T?): ConfigVariable<T> = internal.defaultValue(t) +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/FilePropertiesProvider.kt b/src/main/kotlin/com/romangraef/jrconfig/FilePropertiesProvider.kt index fda7bf9..9fe1ec8 100644 --- a/src/main/kotlin/com/romangraef/jrconfig/FilePropertiesProvider.kt +++ b/src/main/kotlin/com/romangraef/jrconfig/FilePropertiesProvider.kt @@ -6,7 +6,7 @@ import java.io.FileOutputStream import java.io.IOException import java.util.* -class FilePropertiesProvider(private val file: File) : ConfigProvider { +class FilePropertiesProvider(private val file: File) : ConfigSaveLoadProvider { private var properties: Properties = Properties() init { @@ -28,17 +28,19 @@ class FilePropertiesProvider(private val file: File) : ConfigProvider { return properties.getProperty(point) } - override fun setData(point: String, data: String) { + override fun setData(point: String, data: String): Boolean { properties.setProperty(point, data) - save() + return save() } - private fun save() { + private fun save(): Boolean { try { properties.store(FileOutputStream(file), "application config") + return true } catch (e: IOException) { e.printStackTrace() } + return false } diff --git a/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt index ae38409..e1034c2 100644 --- a/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt +++ b/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt @@ -2,7 +2,7 @@ package com.romangraef.jrconfig import java.util.function.Function -abstract class TransformerConfigVariable<T>(private val provider: ConfigProvider, private val point: String) : +abstract class TransformerConfigVariable<T>(private val provider: ConfigSaveLoadProvider, private val point: String) : ConfigVariable<T> { protected abstract fun transform(value: String): T protected abstract fun serialize(data: T): String @@ -12,16 +12,22 @@ abstract class TransformerConfigVariable<T>(private val provider: ConfigProvider } - override fun set(value: T) = + override fun set(value: T) { provider.setData(point, serialize(value)) + } + override fun defaultValue(t: T?): ConfigVariable<T> = if (t == null) { + this + } else { + DefaultConfigVariable(this, t) + } companion object { /** * Quick and dirty. Please consider using a subclass. */ fun <T> getVariable( - provider: ConfigProvider, + provider: ConfigSaveLoadProvider, point: String, transform: Function<String, T>, serialize: Function<T, String> diff --git a/src/main/kotlin/com/romangraef/jrconfig/variables/DoubleVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/variables/DoubleVariable.kt new file mode 100644 index 0000000..db0dbce --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/variables/DoubleVariable.kt @@ -0,0 +1,15 @@ +package com.romangraef.jrconfig.variables + +import com.romangraef.jrconfig.ConfigSaveLoadProvider +import com.romangraef.jrconfig.TransformerConfigVariable + +class DoubleVariable(provider: ConfigSaveLoadProvider, point: String) : + TransformerConfigVariable<Double>(provider, point) { + override fun transform(value: String): Double { + return value.toDouble() + } + + override fun serialize(data: Double): String { + return data.toString() + } +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/variables/EnumVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/variables/EnumVariable.kt new file mode 100644 index 0000000..2a65177 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/variables/EnumVariable.kt @@ -0,0 +1,15 @@ +package com.romangraef.jrconfig.variables + +import com.romangraef.jrconfig.ConfigSaveLoadProvider +import com.romangraef.jrconfig.TransformerConfigVariable + +class EnumVariable<T : Enum<T>>(val enumClass: Class<T>, provider: ConfigSaveLoadProvider, point: String) : + TransformerConfigVariable<T>(provider, point) { + override fun transform(value: String): T { + return java.lang.Enum.valueOf(enumClass, value) + } + + override fun serialize(data: T): String { + return data.name + } +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/variables/FloatVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/variables/FloatVariable.kt new file mode 100644 index 0000000..6a8bb61 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/variables/FloatVariable.kt @@ -0,0 +1,15 @@ +package com.romangraef.jrconfig.variables + +import com.romangraef.jrconfig.ConfigSaveLoadProvider +import com.romangraef.jrconfig.TransformerConfigVariable + +class FloatVariable(provider: ConfigSaveLoadProvider, point: String) : + TransformerConfigVariable<Float>(provider, point) { + override fun transform(value: String): Float { + return value.toFloat() + } + + override fun serialize(data: Float): String { + return data.toString() + } +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/variables/IntegerVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/variables/IntegerVariable.kt index 97cd719..0d9c11e 100644 --- a/src/main/kotlin/com/romangraef/jrconfig/variables/IntegerVariable.kt +++ b/src/main/kotlin/com/romangraef/jrconfig/variables/IntegerVariable.kt @@ -1,9 +1,9 @@ package com.romangraef.jrconfig.variables -import com.romangraef.jrconfig.ConfigProvider +import com.romangraef.jrconfig.ConfigSaveLoadProvider import com.romangraef.jrconfig.TransformerConfigVariable -class IntegerVariable(provider: ConfigProvider, point: String) : +class IntegerVariable(provider: ConfigSaveLoadProvider, point: String) : TransformerConfigVariable<Int>(provider, point) { override fun transform(value: String): Int { return value.toInt() diff --git a/src/main/kotlin/com/romangraef/jrconfig/variables/LongVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/variables/LongVariable.kt new file mode 100644 index 0000000..90c8601 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/variables/LongVariable.kt @@ -0,0 +1,15 @@ +package com.romangraef.jrconfig.variables + +import com.romangraef.jrconfig.ConfigSaveLoadProvider +import com.romangraef.jrconfig.TransformerConfigVariable + +class LongVariable(provider: ConfigSaveLoadProvider, point: String) : + TransformerConfigVariable<Long>(provider, point) { + override fun transform(value: String): Long { + return value.toLong() + } + + override fun serialize(data: Long): String { + return data.toString() + } +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/variables/StringVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/variables/StringVariable.kt index 62ee801..9ec92e2 100644 --- a/src/main/kotlin/com/romangraef/jrconfig/variables/StringVariable.kt +++ b/src/main/kotlin/com/romangraef/jrconfig/variables/StringVariable.kt @@ -1,9 +1,9 @@ package com.romangraef.jrconfig.variables -import com.romangraef.jrconfig.ConfigProvider +import com.romangraef.jrconfig.ConfigSaveLoadProvider import com.romangraef.jrconfig.TransformerConfigVariable -class StringVariable(provider: ConfigProvider, point: String) : +class StringVariable(provider: ConfigSaveLoadProvider, point: String) : TransformerConfigVariable<String>(provider, point) { override fun transform(value: String): String { return value |