I've been trying to make a simple <#CCGG2R64Q|jasy...
# serialization
d
I've been trying to make a simple #jasync-sql resultset decoder, just wondering if what I came up with is right. Is there a better way to do this?
Copy code
@OptIn(ExperimentalSerializationApi::class)
class JasyncResultSetDecoder(
    val resultSet: ResultSet,
) : AbstractDecoder() {
    private var elementIndex = -1
    private var rowIndex = -1

    override val serializersModule = EmptySerializersModule()

    override fun decodeValue(): Any {
        return resultSet[rowIndex][elementIndex]
            ?: error("Error decoding row $rowIndex, $elementIndex in ${resultSet.joinToString { it.joinToString() }}")
    }

    override fun decodeElementIndex(descriptor: SerialDescriptor): Int {
        if (elementIndex == descriptor.elementsCount -1) return  CompositeDecoder.DECODE_DONE
        return ++elementIndex
    }

    override fun decodeNotNullMark(): Boolean = resultSet[rowIndex][elementIndex] != null

    fun nextRow(): Boolean {
        elementIndex = -1
        return ++rowIndex < resultSet.size
    }
}

@OptIn(InternalSerializationApi::class)
inline fun <reified T : Any> decodeFromResultSet(resultSet: ResultSet): List<T> {
    val decoder = JasyncResultSetDecoder(resultSet)
    val deserializer = T::class.serializer()

    return buildList {
        while (decoder.nextRow()) {
            add(deserializer.deserialize(decoder))
        }
    }
}
Is this how I'm supposed to handle the list?
ResultSet
derives from
List<RowData>
, or should I have made a decoder only for RowData, and handled the ResultSet differently?