All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.freya022.botcommands.internal.parameters.ParameterResolverAdapters.kt Maven / Gradle / Ivy

package io.github.freya022.botcommands.internal.parameters

import io.github.freya022.botcommands.api.core.service.annotations.Resolver
import io.github.freya022.botcommands.api.core.utils.shortQualifiedName
import io.github.freya022.botcommands.api.parameters.ClassParameterResolver
import io.github.freya022.botcommands.api.parameters.ParameterResolverFactory
import io.github.freya022.botcommands.api.parameters.ResolverRequest
import io.github.freya022.botcommands.api.parameters.TypedParameterResolver
import kotlin.reflect.full.withNullability
import kotlin.reflect.jvm.javaType

private class ClassParameterResolverFactoryAdapter>(
    private val resolver: T,
    override val priority: Int,
): ParameterResolverFactory(resolver::class) {
    override val supportedTypesStr: List = listOf(resolver.jvmErasure.shortQualifiedName)

    override fun isResolvable(request: ResolverRequest): Boolean = resolver.jvmErasure == request.parameter.erasure
    override fun get(request: ResolverRequest): T = resolver
    override fun toString(): String = "ClassParameterResolverFactoryAdapter(resolver=$resolver)"
}

internal fun > T.toResolverFactory(annotation: Resolver): ParameterResolverFactory {
    return ClassParameterResolverFactoryAdapter(this, annotation.priority)
}

private class TypedParameterResolverFactoryAdapter>(
    private val resolver: T,
    override val priority: Int,
): ParameterResolverFactory(resolver::class) {
    override val supportedTypesStr: List = listOf(resolver.type.shortQualifiedName)

    override fun isResolvable(request: ResolverRequest): Boolean {
        val requestedType = request.parameter.type
        return resolver.type == requestedType
                // Resolver of type T can resolve parameters of type T?
                || resolver.type == requestedType.withNullability(false)
                // Improves Java interoperability
                // Prevents issues when the resolver is for a k.c.List and Java parameter is a j.u.List
                // KType#javaType may have a few unsupported cases (it uses KType#stdlibJavaType),
                // while I believe it won't affect anyone,
                // it's still used as a last resort, just in case
                || resolver.type.javaType == requestedType.javaType
    }

    override fun get(request: ResolverRequest): T = resolver
    override fun toString(): String = "TypedParameterResolverFactoryAdapter(resolver=$resolver)"
}

internal fun > T.toResolverFactory(annotation: Resolver): ParameterResolverFactory {
    return TypedParameterResolverFactoryAdapter(this, annotation.priority)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy