Skip to content

Commit

Permalink
基于KotlinxIO改善Resource[部分]
Browse files Browse the repository at this point in the history
Signed-off-by: ForteScarlet <ForteScarlet@163.com>
  • Loading branch information
ForteScarlet committed Dec 12, 2024
1 parent fb70149 commit fed5311
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,14 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import love.forte.simbot.common.id.ID
import love.forte.simbot.common.id.IDContainer
import love.forte.simbot.message.At.Companion.equals
import love.forte.simbot.message.At.Companion.hashCode
import love.forte.simbot.message.OfflineImage.Companion.toOfflineImage
import love.forte.simbot.message.Text.Companion.of
import love.forte.simbot.resource.*
import love.forte.simbot.resource.ByteArrayResource
import love.forte.simbot.resource.Resource
import love.forte.simbot.resource.ResourceBase64Serializer
import love.forte.simbot.resource.fileResource
import kotlin.io.encoding.ExperimentalEncodingApi
import kotlin.js.JsName
import kotlin.jvm.*
Expand Down Expand Up @@ -348,7 +353,6 @@ public interface OfflineImage : Image {
*/
@JvmStatic
@JvmName("ofFilePath")
@ExperimentalIOResourceAPI
public fun fileOfflineImage(filePath: String): OfflineImage =
fileResource(filePath).toOfflineResourceImage()

Expand All @@ -363,7 +367,6 @@ public interface OfflineImage : Image {
* @since 4.7.0
*/
@JvmStatic
@ExperimentalIOResourceAPI
@JvmName("ofFilePath")
public fun fileOfflineImage(base: String, vararg parts: String): OfflineImage =
fileResource(base, *parts).toOfflineResourceImage()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ public annotation class ExperimentalIOResourceAPI
* @since 4.7.0
*/
@JvmName("valueOfPath")
@ExperimentalIOResourceAPI
public fun fileResource(filePath: String): SourceResource {
return Path(filePath).toResource()
}
Expand All @@ -94,7 +93,6 @@ public fun fileResource(filePath: String): SourceResource {
* @since 4.7.0
*/
@JvmName("valueOfPath")
@ExperimentalIOResourceAPI
public fun fileResource(base: String, vararg parts: String): SourceResource {
return Path(base, *parts).toResource()
}
Expand All @@ -110,19 +108,32 @@ public fun fileResource(base: String, vararg parts: String): SourceResource {
* @since 4.8.0
*/
@JvmName("valueOf")
@ExperimentalIOResourceAPI
public fun Path.toResource(): SourceResource {
return FilePathResource(this)
}

/**
* 提供一个用于产生 [Source] 的供应函数 [provider],
* 并得到一个 [SourceResource]。
*
* 得到的结果每次使用 [SourceResource.source] 都会通过 [provider]
* 获取一个 [Source]。[Source] 应当由使用者决定关闭时机,而不是在 [provider] 中。
*
* @since 4.10.0
*/
@JvmName("valueOf")
public fun sourceResource(provider: () -> Source): SourceResource {
return SourceResourceImpl(provider)
}


/**
* 一个可以得到 [kotlinx.io.Source] 的 [Resource]。
*
* @see fileResource
*
* @since 4.7.0
*/
@ExperimentalIOResourceAPI
public interface SourceResource : Resource {
/**
* 得到一个用于本次数据读取的 [Source].
Expand Down Expand Up @@ -154,7 +165,6 @@ public interface SourceResource : Resource {
override fun data(): ByteArray = source().use { it.readByteArray() }
}

@ExperimentalIOResourceAPI
private data class FilePathResource(val path: Path) : SourceResource {
private val source
get() = SystemFileSystem.source(path)
Expand All @@ -163,3 +173,9 @@ private data class FilePathResource(val path: Path) : SourceResource {
override fun source(): Source = source.buffered()
}

/**
* @since 4.10.0
*/
private data class SourceResourceImpl(val provider: () -> Source) : SourceResource {
override fun source(): Source = provider()
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

package love.forte.simbot.resource

import kotlinx.io.Buffer
import kotlinx.io.Source
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
Expand Down Expand Up @@ -59,7 +61,7 @@ import kotlin.jvm.JvmName
*
* @author ForteScarlet
*/
public interface Resource {
public sealed interface Resource {
// TODO become `sealed` for ByteArrayResource and SourceResource.

/**
Expand All @@ -83,11 +85,15 @@ public fun ByteArray.toResource(): ByteArrayResource = ByteArrayResourceImpl(thi
*
* @author forte
*/
public interface ByteArrayResource : Resource {
public interface ByteArrayResource : Resource, SourceResource {
/**
* 获取到字节数组结果。
*/
override fun data(): ByteArray

override fun source(): Source {
return Buffer().apply { write(data()) }
}
}

/**
Expand Down Expand Up @@ -147,12 +153,18 @@ private data class ByteArrayResourceImpl(private val raw: ByteArray) : ByteArray
* 一个可以读取到 [String] 内容物的拓展类型。
* 是其他 [Resource] 类型的附加能力,但不属于一个标准的 [Resource] 类型。
*/
public interface StringReadableResource : Resource {
public interface StringReadableResource : SourceResource {
/**
* 读取此资源的 [String] 内容。
*/
@Throws(Exception::class)
public fun string(): String

override fun data(): ByteArray = string().encodeToByteArray()

override fun source(): Source {
return Buffer().apply { write(data()) }
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
package love.forte.simbot.resource

import kotlinx.io.Source
import kotlinx.io.asInputStream
import kotlinx.io.asSource
import kotlinx.io.buffered
import love.forte.simbot.resource.JvmStringReadableResource.Companion.DEFAULT_CHARSET
Expand All @@ -38,31 +39,47 @@ import java.net.URL
import java.nio.charset.Charset
import java.nio.file.OpenOption
import java.nio.file.Path
import kotlin.Throws
import kotlin.io.path.inputStream
import kotlin.io.path.readBytes
import kotlin.io.path.reader

/**
* 从 [SourceResource] 中通过 [Source] 获取一个 [InputStream]。
*/
public fun SourceResource.inputStream(): InputStream {
return source().asInputStream()
}

/**
* 能够获取到 [InputStream] 资源的 [Resource] 扩展实现。
*
* Deprecated since v4.10.0: 直接通过 [SourceResource.inputStream]
* 或 [Source.asInputStream] 即可将 [SourceResource] 中的 [Source] 转化为 [InputStream]。
*
* ```kotlin
* val input1 = resource.inputStream()
* val input2 = resource.source().asInputStream()
* ```
*
* Java 中分别对应 `Resources.inputStream(sourceResource)`
* 和 `SourcesJvmKt.asInputStream(source)`。
*
* ```java
* var input1 = Resources,inputStream(resource);
* var input2 = SourcesJvmKt.asInputStream(resource.source());
* ```
*
* @author forte
*/
@OptIn(ExperimentalIOResourceAPI::class)
public interface InputStreamResource : Resource {
/**
* 读取当前资源的所有字节数据。
* 默认通过 [inputStream] 读取。
*
*/
@Throws(IOException::class)
override fun data(): ByteArray = inputStream().use { it.readAllBytes() }

@Deprecated(
"Just use `SourceResource.inputStream()` to get InputStream from Source"
)
public interface InputStreamResource : SourceResource {
/**
* 获取可用于读取当前资源数据的输入流。
*/
@Throws(IOException::class)
public fun inputStream(): InputStream
public fun inputStream(): InputStream = source().asInputStream()
}

/**
Expand All @@ -84,7 +101,6 @@ public interface JvmStringReadableResource : StringReadableResource {
@Throws(IOException::class)
public fun string(charset: Charset): String


public companion object {
/**
* 默认编码格式: [Charsets.UTF_8]
Expand All @@ -97,8 +113,14 @@ public interface JvmStringReadableResource : StringReadableResource {
/**
* 能够获取到 [Reader] 资源的 [Resource] 扩展实现。
*
* Deprecated since v4.10.0.
* 可以直接获取到 [InputStream], 进而直接获取到 reader, 此接口意义不大。
*
* @author forte
*/
@Deprecated(
"Just use `SourceResource.inputStream()` to get InputStream from Source"
)
public interface ReaderResource : JvmStringReadableResource {
/**
* 读取当前资源的字符串数据。
Expand Down Expand Up @@ -189,7 +211,6 @@ public interface FileResource : InputStreamResource, ReaderResource {
public fun File.toResource(charset: Charset = DEFAULT_CHARSET): FileResource =
FileResourceImpl(this, charset)

@OptIn(ExperimentalIOResourceAPI::class)
private data class FileResourceImpl(override val file: File, private val charset: Charset) :
FileResource, SourceResource {
override fun string(): String = string(charset)
Expand Down Expand Up @@ -278,7 +299,6 @@ public fun Path.toResource(
): PathResource =
PathResourceImpl(this, charset, options)

@OptIn(ExperimentalIOResourceAPI::class)
private data class PathResourceImpl(
override val path: Path,
private val charset: Charset,
Expand Down Expand Up @@ -400,7 +420,6 @@ public fun URL.toResource(charset: Charset = DEFAULT_CHARSET): URIResource =
public fun URI.toResource(charset: Charset = DEFAULT_CHARSET): URIResource =
URIResourceImpl(this, charset, null)

@OptIn(ExperimentalIOResourceAPI::class)
private class URIResourceImpl(override val uri: URI, val charset: Charset, private var url: URL? = null) :
URIResource,
SourceResource {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@

package resource

import love.forte.simbot.resource.ExperimentalIOResourceAPI
import love.forte.simbot.resource.SourceResource
import love.forte.simbot.resource.toResource
import java.io.File
Expand All @@ -37,7 +36,6 @@ import kotlin.test.assertIs
*
* @author ForteScarlet
*/
@OptIn(ExperimentalIOResourceAPI::class)
class SourceResourceTypeTests {

@Test
Expand Down

0 comments on commit fed5311

Please sign in to comment.