aPureBase / KGraphQL

Pure Kotlin GraphQL implementation
https://kgraphql.io
MIT License
298 stars 58 forks source link

Provide better errors for KType errors #155

Open jeggy opened 3 years ago

jeggy commented 3 years ago

Here's an example error of when using a Exposed class: Exception in thread "main" com.apurebase.kgraphql.schema.SchemaException: Generic types are not supported by GraphQL, found kotlin.collections.Map<org.jetbrains.exposed.sql.Expression<*>, kotlin.Int> thrown from SchemaCompilation.kt:168

Instead of throwing this error, it would be great to provide a error message which recursively provides full information of exactly where this issue is coming from.

In a Exposed sample, the reason would be because of the type is extending the Entity<Int> type, and a field on this class is ResultRow and it's here the field fieldIndex of the type Map<Expression<*>, Int> lies, which is causing this to fail.

Martmists-GH commented 1 year ago

For the specific case of Exposed's DAO, it'd be nice to only use the properties defined on the class itself using KClass<T>.declaredMemberProperties. While this does mean you lose some benefits of inheritance, there exist solutions to it, e.g.

open class A {
    open val x: Int = 1
}

class B : A() {
    override val x: Int  // Redeclares x, but doesn't redefine it, meaning it acts as effectively a no-op and still shows up in declaredMemberProperties
        get() = super.x
}

This way, properties of Entity<T> are not included unless expressly so, fixing a lot of the issues currently happening with Exposed.