diff --git a/korge-core/build.gradle.kts b/korge-core/build.gradle.kts index 4f47ecd27b..5d6d58775c 100644 --- a/korge-core/build.gradle.kts +++ b/korge-core/build.gradle.kts @@ -8,6 +8,8 @@ dependencies { commonMainApi(project(":korlibs-template")) commonMainApi(project(":korge-foundation")) commonMainApi(project(":korlibs-serialization-yaml")) + commonMainApi(project(":korlibs-serialization-toml")) + commonMainApi(project(":korlibs-serialization-csv")) commonMainApi(libs.kotlinx.coroutines.core) commonMainApi(libs.kotlinx.atomicfu) //add("commonMainApi", libs.kotlinx.atomicfu) diff --git a/korge-core/src/korlibs/io/util/StrReader.kt b/korge-core/src/korlibs/io/util/StrReader.kt index 15aa36491e..e22718b4c3 100644 --- a/korge-core/src/korlibs/io/util/StrReader.kt +++ b/korge-core/src/korlibs/io/util/StrReader.kt @@ -4,6 +4,7 @@ import korlibs.datastructure.* import korlibs.datastructure.iterators.fastForEach import korlibs.io.lang.* import korlibs.io.stream.* +import korlibs.util.* import kotlin.collections.* import kotlin.math.max import kotlin.math.min @@ -11,16 +12,16 @@ import kotlin.math.min /** * @TODO: Make this an interface, but inline functions would need to be extension methods breaking source-compatibility **/ -abstract class BaseStrReader { +abstract class BaseStrReader : SimpleStrReader { abstract val eof: Boolean abstract val pos: Int - val hasMore: Boolean get() = !eof + override val hasMore: Boolean get() = !eof abstract fun peekOffset(offset: Int = 0): Char abstract fun peek(count: Int): String - open fun peekChar(): Char = peekOffset(0) - open fun readChar(): Char { + override fun peekChar(): Char = peekOffset(0) + override fun readChar(): Char { val out = peekChar() skip(1) return out diff --git a/korlibs-serialization-csv/.gitignore b/korlibs-serialization-csv/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/korlibs-serialization-csv/.gitignore @@ -0,0 +1 @@ +/build diff --git a/korlibs-serialization-csv/build.gradle.kts b/korlibs-serialization-csv/build.gradle.kts new file mode 100644 index 0000000000..c9cc1e3fda --- /dev/null +++ b/korlibs-serialization-csv/build.gradle.kts @@ -0,0 +1,16 @@ +import korlibs.* + +description = "Korlibs CSV Serialization Library" + +project.extensions.extraProperties.properties.apply { + applyProjectProperties( + "https://raw.githubusercontent.com/korlibs/korge/main/korlibs-serialization-csv", + "Public Domain", + "https://raw.githubusercontent.com/korlibs/korge/main/korlibs-serialization-csv/LICENSE" + ) +} + + +dependencies { + commonMainApi(project(":korlibs-util")) +} diff --git a/korge-core/src/korlibs/serialization/CSV.kt b/korlibs-serialization-csv/src/korlibs/io/serialization/csv/CSV.kt similarity index 90% rename from korge-core/src/korlibs/serialization/CSV.kt rename to korlibs-serialization-csv/src/korlibs/io/serialization/csv/CSV.kt index fea841142b..a2b0991e97 100644 --- a/korge-core/src/korlibs/serialization/CSV.kt +++ b/korlibs-serialization-csv/src/korlibs/io/serialization/csv/CSV.kt @@ -2,7 +2,7 @@ package korlibs.io.serialization.csv -import korlibs.io.util.StrReader +import korlibs.util.* class CSV(val lines: List>, val names: List? = null) : Collection { val namesToIndex: Map = names?.withIndex()?.associate { it.value to it.index } ?: emptyMap() @@ -47,13 +47,13 @@ class CSV(val lines: List>, val names: List? = null) : Coll return values.joinToString("$separator") { serializeElement(it, separator) } } - fun parseLine(line: String, separator: Char = DEFAULT_SEPARATOR): List = parseLine(StrReader(line), separator) + fun parseLine(line: String, separator: Char = DEFAULT_SEPARATOR): List = parseLine(SimpleStrReader(line), separator) - fun parseLine(line: StrReader, separator: Char = DEFAULT_SEPARATOR): List { + fun parseLine(line: SimpleStrReader, separator: Char = DEFAULT_SEPARATOR): List { val out = arrayListOf() val str = StringBuilder() while (line.hasMore) { - val c = line.read() + val c = line.readChar() when (c) { // Quoted string '"' -> { @@ -92,7 +92,7 @@ class CSV(val lines: List>, val names: List? = null) : Coll return out } - fun parse(s: StrReader, separator: Char = DEFAULT_SEPARATOR, headerNames: Boolean = true): CSV { + fun parse(s: SimpleStrReader, separator: Char = DEFAULT_SEPARATOR, headerNames: Boolean = true): CSV { val lines = arrayListOf>() while (s.hasMore) { lines.add(parseLine(s, separator)) @@ -100,6 +100,6 @@ class CSV(val lines: List>, val names: List? = null) : Coll return if (headerNames) CSV(lines.drop(1), lines[0]) else CSV(lines, null) } - fun parse(str: String, separator: Char = DEFAULT_SEPARATOR, headerNames: Boolean = true): CSV = parse(StrReader(str), separator, headerNames) + fun parse(str: String, separator: Char = DEFAULT_SEPARATOR, headerNames: Boolean = true): CSV = parse(SimpleStrReader(str), separator, headerNames) } } diff --git a/korge-core/test/korlibs/io/serialization/csv/CSVTest.kt b/korlibs-serialization-csv/test/korlibs/io/serialization/csv/CSVTest.kt similarity index 100% rename from korge-core/test/korlibs/io/serialization/csv/CSVTest.kt rename to korlibs-serialization-csv/test/korlibs/io/serialization/csv/CSVTest.kt diff --git a/korlibs-serialization-toml/.gitignore b/korlibs-serialization-toml/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/korlibs-serialization-toml/.gitignore @@ -0,0 +1 @@ +/build diff --git a/korlibs-serialization-toml/build.gradle.kts b/korlibs-serialization-toml/build.gradle.kts new file mode 100644 index 0000000000..0ac3caa1df --- /dev/null +++ b/korlibs-serialization-toml/build.gradle.kts @@ -0,0 +1,14 @@ +import korlibs.* + +description = "Korlibs TOML Serialization Library" + +project.extensions.extraProperties.properties.apply { + applyProjectProperties( + "https://raw.githubusercontent.com/korlibs/korge/main/korlibs-serialization-toml", + "Public Domain", + "https://raw.githubusercontent.com/korlibs/korge/main/korlibs-serialization-toml/LICENSE" + ) +} + +dependencies { +} diff --git a/korge-core/src/korlibs/serialization/TOML.kt b/korlibs-serialization-toml/src/korlibs/io/serialization/toml/TOML.kt similarity index 98% rename from korge-core/src/korlibs/serialization/TOML.kt rename to korlibs-serialization-toml/src/korlibs/io/serialization/toml/TOML.kt index 416717eec5..109c0462ad 100644 --- a/korge-core/src/korlibs/serialization/TOML.kt +++ b/korlibs-serialization-toml/src/korlibs/io/serialization/toml/TOML.kt @@ -3,7 +3,6 @@ package korlibs.io.serialization.toml //import org.intellij.lang.annotations.Language -import korlibs.math.geom.* import kotlin.math.min // @TODO: Dates @@ -248,8 +247,3 @@ object TOML { override fun toString(): String = "StrReader[$len](pos=$pos, peek='${str.substring(pos, min(len, pos + 10))}')" } } - -fun test() { - Angle.between(Point(10, 10), Point(30, 30), Vector2D.UP_SCREEN) - Point.angle(Point(10, 10), Point(30, 30), Vector2D.UP_SCREEN) -} diff --git a/korge-core/test/korlibs/io/serialization/toml/TOMLTest.kt b/korlibs-serialization-toml/test/korlibs/io/serialization/toml/TOMLTest.kt similarity index 100% rename from korge-core/test/korlibs/io/serialization/toml/TOMLTest.kt rename to korlibs-serialization-toml/test/korlibs/io/serialization/toml/TOMLTest.kt diff --git a/korlibs-util/src/korlibs/util/SimpleStrReader.kt b/korlibs-util/src/korlibs/util/SimpleStrReader.kt new file mode 100644 index 0000000000..e9b16d92db --- /dev/null +++ b/korlibs-util/src/korlibs/util/SimpleStrReader.kt @@ -0,0 +1,17 @@ +package korlibs.util + +interface SimpleStrReader { + val hasMore: Boolean + fun readChar(): Char + fun peekChar(): Char + + companion object { + private class Impl(val str: String, var pos: Int) : SimpleStrReader { + override val hasMore: Boolean get() = pos < str.length + + override fun readChar(): Char = peekChar().also { pos++ } + override fun peekChar(): Char = str.getOrElse(pos) { '\u0000' } + } + operator fun invoke(str: String, pos: Int = 0): SimpleStrReader = Impl(str, pos) + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 4ca11b20d6..787a9e20ea 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -36,6 +36,8 @@ include(":korlibs-inject") include(":korlibs-time") include(":korlibs-crypto") include(":korlibs-serialization-yaml") +include(":korlibs-serialization-toml") +include(":korlibs-serialization-csv") include(":korlibs-template") include(":korge-foundation") include(":korge-core")