Skip to content

Commit 3fc3343

Browse files
committed
✨ Add @serialization support to PlatformFile
1 parent 2264c14 commit 3fc3343

File tree

12 files changed

+113
-12
lines changed

12 files changed

+113
-12
lines changed

filekit-core/build.gradle.kts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
44
plugins {
55
alias(libs.plugins.androidLibrary)
66
alias(libs.plugins.kotlinMultiplatform)
7+
alias(libs.plugins.kotlinSerialization)
78
alias(libs.plugins.vanniktech.mavenPublish)
89
}
910

@@ -55,6 +56,9 @@ kotlin {
5556

5657
// Kotlinx IO
5758
api(libs.kotlinx.io)
59+
60+
// Kotlinx Serialization
61+
implementation(libs.kotlinx.serialization.core)
5862
}
5963

6064
commonTest.dependencies {
@@ -69,6 +73,9 @@ kotlin {
6973
}
7074
}
7175
val nonWebTest by creating { dependsOn(commonTest.get()) }
76+
nonWebTest.dependencies {
77+
implementation(libs.kotlinx.serialization.json)
78+
}
7279

7380
val jvmAndNativeMain by creating { dependsOn(nonWebMain) }
7481

filekit-core/src/androidMain/kotlin/io/github/vinceglb/filekit/PlatformFile.android.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ import kotlinx.io.asSink
2121
import kotlinx.io.asSource
2222
import kotlinx.io.files.Path
2323
import kotlinx.io.files.SystemFileSystem
24+
import kotlinx.serialization.Serializable
2425
import java.io.File
2526
import java.nio.file.Files
2627
import java.nio.file.attribute.BasicFileAttributes
2728
import kotlin.time.ExperimentalTime
2829
import kotlin.time.Instant
2930

31+
@Serializable(with = PlatformFileSerializer::class)
3032
public actual data class PlatformFile(
3133
val androidFile: AndroidFile
3234
) {

filekit-core/src/appleMain/kotlin/io/github/vinceglb/filekit/PlatformFile.apple.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import kotlinx.coroutines.IO
2323
import kotlinx.coroutines.withContext
2424
import kotlinx.io.files.Path
2525
import kotlinx.io.files.SystemFileSystem
26+
import kotlinx.serialization.Serializable
2627
import platform.CoreFoundation.CFRelease
2728
import platform.CoreFoundation.CFStringCreateWithCString
2829
import platform.CoreFoundation.CFStringGetCString
@@ -46,6 +47,7 @@ import platform.UniformTypeIdentifiers.UTType
4647
import kotlin.time.ExperimentalTime
4748
import kotlin.time.Instant
4849

50+
@Serializable(with = PlatformFileSerializer::class)
4951
public actual data class PlatformFile(
5052
val nsUrl: NSURL,
5153
) {
@@ -220,16 +222,6 @@ public actual suspend fun PlatformFile.bookmarkData(): BookmarkData = withContex
220222
}
221223
}
222224

223-
internal actual suspend fun PlatformFile.prepareDestinationForWrite(
224-
source: PlatformFile
225-
): PlatformFile = withScopedAccess {
226-
if (isDirectory()) {
227-
PlatformFile(toKotlinxIoPath() / source.name)
228-
} else {
229-
this
230-
}
231-
}
232-
233225
public actual fun PlatformFile.releaseBookmark() {}
234226

235227
@OptIn(ExperimentalForeignApi::class, BetaInteropApi::class)

filekit-core/src/commonMain/kotlin/io/github/vinceglb/filekit/PlatformFile.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package io.github.vinceglb.filekit
22

33
import io.github.vinceglb.filekit.mimeType.MimeType
4+
import kotlinx.serialization.Serializable
45

6+
@Serializable(with = PlatformFileSerializer::class)
57
public expect class PlatformFile {
68
override fun toString(): String
79
public companion object
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.github.vinceglb.filekit
2+
3+
import kotlinx.serialization.KSerializer
4+
import kotlinx.serialization.descriptors.SerialDescriptor
5+
import kotlinx.serialization.encoding.Decoder
6+
import kotlinx.serialization.encoding.Encoder
7+
8+
public expect object PlatformFileSerializer : KSerializer<PlatformFile> {
9+
override val descriptor: SerialDescriptor
10+
override fun serialize(encoder: Encoder, value: PlatformFile)
11+
override fun deserialize(decoder: Decoder): PlatformFile
12+
}

filekit-core/src/jsMain/kotlin/io/github/vinceglb/filekit/PlatformFile.js.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.github.vinceglb.filekit.exceptions.FileKitException
44
import io.github.vinceglb.filekit.mimeType.MimeType
55
import kotlinx.coroutines.Dispatchers
66
import kotlinx.coroutines.withContext
7+
import kotlinx.serialization.Serializable
78
import org.khronos.webgl.ArrayBuffer
89
import org.khronos.webgl.Uint8Array
910
import org.khronos.webgl.get
@@ -13,6 +14,7 @@ import kotlin.coroutines.resume
1314
import kotlin.coroutines.resumeWithException
1415
import kotlin.coroutines.suspendCoroutine
1516

17+
@Serializable(with = PlatformFileSerializer::class)
1618
public actual data class PlatformFile(
1719
val file: File,
1820
) {
@@ -70,4 +72,3 @@ public actual suspend fun PlatformFile.readBytes(): ByteArray = withContext(Disp
7072
public actual fun PlatformFile.mimeType(): MimeType? =
7173
takeIf { file.type.isNotBlank() }
7274
?.let { MimeType.parse(file.type) }
73-
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.github.vinceglb.filekit
2+
3+
import kotlinx.serialization.KSerializer
4+
import kotlinx.serialization.descriptors.PrimitiveKind
5+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
6+
import kotlinx.serialization.descriptors.SerialDescriptor
7+
import kotlinx.serialization.encoding.Decoder
8+
import kotlinx.serialization.encoding.Encoder
9+
10+
private const val unsupportedMessage = "PlatformFile serialization is not supported on JS targets"
11+
12+
public actual object PlatformFileSerializer : KSerializer<PlatformFile> {
13+
actual override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(
14+
serialName = "io.github.vinceglb.filekit.PlatformFile",
15+
kind = PrimitiveKind.STRING
16+
)
17+
18+
actual override fun deserialize(decoder: Decoder): PlatformFile {
19+
error(unsupportedMessage)
20+
}
21+
22+
actual override fun serialize(encoder: Encoder, value: PlatformFile) {
23+
error(unsupportedMessage)
24+
}
25+
}

filekit-core/src/jvmMain/kotlin/io/github/vinceglb/filekit/PlatformFile.jvm.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import io.github.vinceglb.filekit.utils.toFile
55
import io.github.vinceglb.filekit.utils.toKotlinxIoPath
66
import kotlinx.coroutines.Dispatchers
77
import kotlinx.coroutines.withContext
8-
import kotlinx.io.files.Path
98
import kotlinx.io.files.SystemFileSystem
9+
import kotlinx.io.files.Path
1010
import java.io.File
1111
import java.nio.file.Files
1212
import java.nio.file.attribute.BasicFileAttributes
1313
import kotlin.time.ExperimentalTime
1414
import kotlin.time.Instant
15+
import kotlinx.serialization.Serializable
1516

17+
@Serializable(with = PlatformFileSerializer::class)
1618
public actual data class PlatformFile(
1719
val file: File,
1820
) {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.github.vinceglb.filekit
2+
3+
import kotlinx.serialization.KSerializer
4+
import kotlinx.serialization.descriptors.PrimitiveKind
5+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
6+
import kotlinx.serialization.descriptors.SerialDescriptor
7+
import kotlinx.serialization.encoding.Decoder
8+
import kotlinx.serialization.encoding.Encoder
9+
10+
public actual object PlatformFileSerializer : KSerializer<PlatformFile> {
11+
actual override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(
12+
serialName = "io.github.vinceglb.filekit.PlatformFile",
13+
kind = PrimitiveKind.STRING
14+
)
15+
16+
actual override fun deserialize(decoder: Decoder): PlatformFile {
17+
val path = decoder.decodeString()
18+
return PlatformFile(path)
19+
}
20+
21+
actual override fun serialize(encoder: Encoder, value: PlatformFile) {
22+
encoder.encodeString(value.path)
23+
}
24+
}

filekit-core/src/wasmJsMain/kotlin/io/github/vinceglb/filekit/PlatformFile.wasmJs.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.github.vinceglb.filekit.exceptions.FileKitException
44
import io.github.vinceglb.filekit.mimeType.MimeType
55
import kotlinx.coroutines.Dispatchers
66
import kotlinx.coroutines.withContext
7+
import kotlinx.serialization.Serializable
78
import org.khronos.webgl.ArrayBuffer
89
import org.khronos.webgl.Uint8Array
910
import org.khronos.webgl.get
@@ -13,6 +14,7 @@ import kotlin.coroutines.resume
1314
import kotlin.coroutines.resumeWithException
1415
import kotlin.coroutines.suspendCoroutine
1516

17+
@Serializable(with = PlatformFileSerializer::class)
1618
public actual data class PlatformFile(
1719
val file: File,
1820
) {
@@ -30,9 +32,11 @@ public actual val PlatformFile.extension: String
3032
public actual val PlatformFile.nameWithoutExtension: String
3133
get() = name.substringBeforeLast(".", name)
3234

35+
@OptIn(ExperimentalWasmJsInterop::class)
3336
public actual fun PlatformFile.size(): Long =
3437
file.size.toDouble().toLong()
3538

39+
@OptIn(ExperimentalWasmJsInterop::class)
3640
public actual suspend fun PlatformFile.readBytes(): ByteArray = withContext(Dispatchers.Main) {
3741
suspendCoroutine { continuation ->
3842
val reader = FileReader()

0 commit comments

Comments
 (0)