From 77f37f56609e48546fd265308d4bfb7de01fb581 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Wed, 15 Feb 2023 23:21:05 -0800 Subject: [PATCH] dough-fs fixes and cleanup --- .../pizza/dough/fs/DefaultFsPathSerializer.kt | 3 +++ .../kotlin/gay/pizza/dough/fs/FsOperations.kt | 24 ++++++++++++++++--- .../kotlin/gay/pizza/dough/fs/FsPath.kt | 2 +- .../gay/pizza/dough/fs/FsPathSerializer.kt | 4 ++-- .../pizza/dough/fs/OperationsExtensions.kt | 20 ++++++++-------- .../gay/pizza/dough/fs/JavaFsOperations.kt | 21 +++------------- 6 files changed, 40 insertions(+), 34 deletions(-) create mode 100644 dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/DefaultFsPathSerializer.kt diff --git a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/DefaultFsPathSerializer.kt b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/DefaultFsPathSerializer.kt new file mode 100644 index 0000000..3e21ec3 --- /dev/null +++ b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/DefaultFsPathSerializer.kt @@ -0,0 +1,3 @@ +package gay.pizza.dough.fs + +object DefaultFsPathSerializer : FsPathSerializer({ FsPath(it) }) diff --git a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsOperations.kt b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsOperations.kt index 47bf403..37d4987 100644 --- a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsOperations.kt +++ b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsOperations.kt @@ -22,11 +22,29 @@ interface FsOperations { fun readBytesChunked(path: FsPath, block: (ByteArray, Int) -> Unit) fun readJsonFile(path: FsPath, deserializer: DeserializationStrategy): T - fun readLines(path: FsPath, block: (String) -> Unit) + fun readLines(path: FsPath, block: (String) -> Unit) { + readLines(path).forEach(block) + } + fun readLines(path: FsPath): Sequence - fun readJsonLinesToList(path: FsPath, deserializer: DeserializationStrategy, block: (T) -> Unit) - fun readJsonLinesToList(path: FsPath, deserializer: DeserializationStrategy): List + fun readLinesToList(path: FsPath): List { + val lines = mutableListOf() + readLines(path) { line -> lines.add(line) } + return lines + } + + fun readJsonLines(path: FsPath, deserializer: DeserializationStrategy): Sequence + + fun readJsonLines(path: FsPath, deserializer: DeserializationStrategy, block: (T) -> Unit) { + readJsonLines(path, deserializer).forEach(block) + } + + fun readJsonLinesToList(path: FsPath, deserializer: DeserializationStrategy): List { + val results = mutableListOf() + readJsonLines(path, deserializer) { item -> results.add(item) } + return results + } fun writeString(path: FsPath, content: String) fun writeAllBytes(path: FsPath, bytes: ByteArray) diff --git a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsPath.kt b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsPath.kt index 9e6cb67..ee3e5a4 100644 --- a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsPath.kt +++ b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsPath.kt @@ -2,7 +2,7 @@ package gay.pizza.dough.fs import kotlinx.serialization.Serializable -@Serializable(with = FsPathSerializer::class) +@Serializable(with = DefaultFsPathSerializer::class) interface FsPath : Comparable { val fullPathString: String val entityNameString: String diff --git a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsPathSerializer.kt b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsPathSerializer.kt index 35df0c3..6665f3e 100644 --- a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsPathSerializer.kt +++ b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsPathSerializer.kt @@ -6,11 +6,11 @@ import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -object FsPathSerializer : KSerializer { +open class FsPathSerializer(val construct: (String) -> FsPath) : KSerializer { override val descriptor: SerialDescriptor = String.serializer().descriptor override fun deserialize(decoder: Decoder): FsPath { - return FsPath(decoder.decodeString()) + return construct(decoder.decodeString()) } override fun serialize(encoder: Encoder, value: FsPath) { diff --git a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/OperationsExtensions.kt b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/OperationsExtensions.kt index 26e1eef..38f0152 100644 --- a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/OperationsExtensions.kt +++ b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/OperationsExtensions.kt @@ -45,20 +45,20 @@ fun FsPath.readBytesChunked(block: (ByteArray, Int) -> Unit) = fun FsPath.readJsonFile(deserializer: DeserializationStrategy): T = operations.readJsonFile(this, deserializer) -fun FsPath.readLines(block: (String) -> Unit): Unit = - operations.readLines(this, block) - fun FsPath.readLines(): Sequence = operations.readLines(this) -fun FsPath.readLinesToList(): List { - val lines = mutableListOf() - readLines { line -> lines.add(line) } - return lines -} +fun FsPath.readLines(block: (String) -> Unit): Unit = + operations.readLines(this, block) -fun FsPath.readJsonLinesToList(deserializer: DeserializationStrategy, block: (T) -> Unit) = - operations.readJsonLinesToList(this, deserializer, block) +fun FsPath.readLinesToList(): List = + operations.readLinesToList(this) + +fun FsPath.readJsonLines(deserializer: DeserializationStrategy): Sequence = + operations.readJsonLines(this, deserializer) + +fun FsPath.readJsonLines(deserializer: DeserializationStrategy, block: (T) -> Unit) = + operations.readJsonLines(this, deserializer, block) fun FsPath.readJsonLinesToList(deserializer: DeserializationStrategy): List = operations.readJsonLinesToList(this, deserializer) diff --git a/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsOperations.kt b/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsOperations.kt index 54e11ea..6426c9b 100644 --- a/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsOperations.kt +++ b/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsOperations.kt @@ -39,30 +39,15 @@ object JavaFsOperations : FsOperations { override fun readJsonFile(path: FsPath, deserializer: DeserializationStrategy): T = Json.decodeFromString(deserializer, readString(path)) - override fun readLines(path: FsPath, block: (String) -> Unit) { - readLines(path).forEach(block) - } - override fun readLines(path: FsPath): Sequence { val stream = path.toJavaPath().bufferedReader() return stream.lineSequence() } - override fun readJsonLinesToList(path: FsPath, deserializer: DeserializationStrategy, block: (T) -> Unit) { - readLines(path) { line -> - val trimmed = line.trim() - val item = Json.decodeFromString(deserializer, trimmed) - block(item) + override fun readJsonLines(path: FsPath, deserializer: DeserializationStrategy): Sequence = + readLines(path).map { line -> line.trim() }.map { line -> + Json.decodeFromString(deserializer, line) } - } - - override fun readJsonLinesToList(path: FsPath, deserializer: DeserializationStrategy): List { - val results = mutableListOf() - readJsonLinesToList(path, deserializer) { item -> - results.add(item) - } - return results - } override fun writeString(path: FsPath, content: String): Unit = Files.writeString(path.toJavaPath(), content).run {} override fun writeAllBytes(path: FsPath, bytes: ByteArray): Unit = Files.write(path.toJavaPath(), bytes).run {}