aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/com/romangraef
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/com/romangraef')
-rw-r--r--src/main/kotlin/com/romangraef/jrconfig/Config.kt55
-rw-r--r--src/main/kotlin/com/romangraef/jrconfig/ConfigMissingException.kt5
-rw-r--r--src/main/kotlin/com/romangraef/jrconfig/ConfigMissingProviderException.kt4
-rw-r--r--src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt6
-rw-r--r--src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt6
-rw-r--r--src/main/kotlin/com/romangraef/jrconfig/FilePropertiesProvider.kt45
-rw-r--r--src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt41
-rw-r--r--src/main/kotlin/com/romangraef/jrconfig/variables/IntegerVariable.kt15
-rw-r--r--src/main/kotlin/com/romangraef/jrconfig/variables/StringVariable.kt15
9 files changed, 192 insertions, 0 deletions
diff --git a/src/main/kotlin/com/romangraef/jrconfig/Config.kt b/src/main/kotlin/com/romangraef/jrconfig/Config.kt
new file mode 100644
index 0000000..7641689
--- /dev/null
+++ b/src/main/kotlin/com/romangraef/jrconfig/Config.kt
@@ -0,0 +1,55 @@
+package com.romangraef.jrconfig
+
+import com.romangraef.jrconfig.variables.IntegerVariable
+import com.romangraef.jrconfig.variables.StringVariable
+
+typealias ConfigVariableProvider<T> = (ConfigProvider, String) -> ConfigVariable<T>
+
+object Config {
+ private var configProvider: ConfigProvider? = null
+ private val map: MutableMap<Class<*>, 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 <T> get(clazz: Class<out T>, point: String): ConfigVariable<T> {
+ return (map[clazz] as? ConfigVariableProvider<T>)?.invoke(proxyProvider, point)
+ ?: throw ConfigMissingProviderException(clazz)
+ }
+
+ inline fun <reified T> get(point: String) = get(T::class.java, point)
+
+ @JvmStatic
+ fun <T> registerConfigVariableProvider(clazz: Class<T>, provider: ConfigVariableProvider<T>) {
+ map[clazz] = provider
+ }
+
+ inline fun <reified T> registerConfigVariableProvider(noinline provider: ConfigVariableProvider<T>) =
+ registerConfigVariableProvider(T::class.java, provider)
+
+
+ @JvmStatic
+ fun use(provider: ConfigProvider?) {
+ configProvider = provider
+ }
+
+ @JvmStatic
+ fun getString(point: String): ConfigVariable<String> {
+ return get(String::class.java, point)
+ }
+
+} \ No newline at end of file
diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingException.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingException.kt
new file mode 100644
index 0000000..1b609f9
--- /dev/null
+++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingException.kt
@@ -0,0 +1,5 @@
+package com.romangraef.jrconfig
+
+class ConfigMissingException(val point: String) : RuntimeException("The point $point is missing from your config.") {
+
+}
diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingProviderException.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingProviderException.kt
new file mode 100644
index 0000000..4cf03b8
--- /dev/null
+++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingProviderException.kt
@@ -0,0 +1,4 @@
+package com.romangraef.jrconfig
+
+class ConfigMissingProviderException(val clazz: Class<*>) :
+ RuntimeException("You are missing a config provider for the type ${clazz.canonicalName}")
diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt
new file mode 100644
index 0000000..019cdef
--- /dev/null
+++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt
@@ -0,0 +1,6 @@
+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/ConfigVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt
new file mode 100644
index 0000000..5874e76
--- /dev/null
+++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt
@@ -0,0 +1,6 @@
+package com.romangraef.jrconfig
+
+interface ConfigVariable<T> {
+ fun get(): T
+ fun set(value: 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
new file mode 100644
index 0000000..fda7bf9
--- /dev/null
+++ b/src/main/kotlin/com/romangraef/jrconfig/FilePropertiesProvider.kt
@@ -0,0 +1,45 @@
+package com.romangraef.jrconfig
+
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import java.io.IOException
+import java.util.*
+
+class FilePropertiesProvider(private val file: File) : ConfigProvider {
+ private var properties: Properties = Properties()
+
+ init {
+ try {
+ properties.load(FileInputStream(file))
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+
+ companion object {
+ @JvmStatic
+ fun create(fileName: String): ConfigProvider {
+ return FilePropertiesProvider(File(fileName))
+ }
+ }
+
+ override fun provideData(point: String): String? {
+ return properties.getProperty(point)
+ }
+
+ override fun setData(point: String, data: String) {
+ properties.setProperty(point, data)
+ save()
+ }
+
+ private fun save() {
+ try {
+ properties.store(FileOutputStream(file), "application config")
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+
+
+} \ No newline at end of file
diff --git a/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt
new file mode 100644
index 0000000..ae38409
--- /dev/null
+++ b/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt
@@ -0,0 +1,41 @@
+package com.romangraef.jrconfig
+
+import java.util.function.Function
+
+abstract class TransformerConfigVariable<T>(private val provider: ConfigProvider, private val point: String) :
+ ConfigVariable<T> {
+ protected abstract fun transform(value: String): T
+ protected abstract fun serialize(data: T): String
+
+ override fun get(): T {
+ return transform(provider.provideData(point) ?: throw ConfigMissingException(point))
+ }
+
+
+ override fun set(value: T) =
+ provider.setData(point, serialize(value))
+
+
+ companion object {
+ /**
+ * Quick and dirty. Please consider using a subclass.
+ */
+ fun <T> getVariable(
+ provider: ConfigProvider,
+ point: String,
+ transform: Function<String, T>,
+ serialize: Function<T, String>
+ ): TransformerConfigVariable<T> {
+ return object : TransformerConfigVariable<T>(provider, point) {
+ override fun transform(value: String): T {
+ return transform.apply(value)
+ }
+
+ override fun serialize(data: T): String {
+ return serialize.apply(data)
+ }
+ }
+ }
+ }
+
+} \ 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
new file mode 100644
index 0000000..97cd719
--- /dev/null
+++ b/src/main/kotlin/com/romangraef/jrconfig/variables/IntegerVariable.kt
@@ -0,0 +1,15 @@
+package com.romangraef.jrconfig.variables
+
+import com.romangraef.jrconfig.ConfigProvider
+import com.romangraef.jrconfig.TransformerConfigVariable
+
+class IntegerVariable(provider: ConfigProvider, point: String) :
+ TransformerConfigVariable<Int>(provider, point) {
+ override fun transform(value: String): Int {
+ return value.toInt()
+ }
+
+ override fun serialize(data: Int): 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
new file mode 100644
index 0000000..62ee801
--- /dev/null
+++ b/src/main/kotlin/com/romangraef/jrconfig/variables/StringVariable.kt
@@ -0,0 +1,15 @@
+package com.romangraef.jrconfig.variables
+
+import com.romangraef.jrconfig.ConfigProvider
+import com.romangraef.jrconfig.TransformerConfigVariable
+
+class StringVariable(provider: ConfigProvider, point: String) :
+ TransformerConfigVariable<String>(provider, point) {
+ override fun transform(value: String): String {
+ return value
+ }
+
+ override fun serialize(data: String): String {
+ return data
+ }
+} \ No newline at end of file