Csv.kt

  1. package com.hexagontk.serialization.jackson.csv

  2. import com.fasterxml.jackson.dataformat.csv.CsvGenerator
  3. import com.fasterxml.jackson.dataformat.csv.CsvMapper
  4. import com.fasterxml.jackson.dataformat.csv.CsvParser
  5. import com.hexagontk.core.media.MediaType
  6. import com.hexagontk.core.media.TEXT_CSV
  7. import com.hexagontk.serialization.SerializationFormat
  8. import java.io.InputStream
  9. import java.io.OutputStream

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

  12.     override val mediaType: MediaType = TEXT_CSV
  13.     override val textFormat: Boolean = true

  14.     private val mapper: CsvMapper =
  15.         CsvMapper()
  16.             .configure(CsvGenerator.Feature.ALWAYS_QUOTE_EMPTY_STRINGS, false)
  17.             .configure(CsvParser.Feature.ALLOW_TRAILING_COMMA, false)
  18.             .configure(CsvParser.Feature.SKIP_EMPTY_LINES, true)
  19.             .configure(CsvParser.Feature.WRAP_AS_ARRAY, true)

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

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

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