Csv.kt

package com.hexagontk.serialization.jackson.csv

import tools.jackson.dataformat.csv.CsvMapper
import com.hexagontk.core.media.MediaType
import com.hexagontk.core.media.TEXT_CSV
import com.hexagontk.serialization.SerializationFormat
import tools.jackson.dataformat.csv.CsvReadFeature.*
import tools.jackson.dataformat.csv.CsvWriteFeature.*
import java.io.InputStream
import java.io.OutputStream

// TODO Allow configuring adapter passing settings line fields line
object Csv : SerializationFormat {

    override val mediaType: MediaType = TEXT_CSV
    override val textFormat: Boolean = true

    private val mapper: CsvMapper =
        CsvMapper.builder()
            .configure(ALWAYS_QUOTE_EMPTY_STRINGS, false)
            .configure(ALLOW_TRAILING_COMMA, false)
            .configure(SKIP_EMPTY_LINES, true)
            .configure(WRAP_AS_ARRAY, true)
            .build()

    private val reader = mapper.readerForListOf(Any::class.java)

    override fun serialize(instance: Any, output: OutputStream) {
        mapper.writeValue(output, instance)
    }

    override fun parse(input: InputStream): Any =
        reader.readValue(input)
}