Serialization.kt

  1. package com.hexagontk.serialization

  2. import com.hexagontk.core.text.toStream
  3. import com.hexagontk.core.media.MediaType
  4. import com.hexagontk.core.media.mediaTypeOf
  5. import com.hexagontk.serialization.SerializationManager.formatOf
  6. import java.io.File
  7. import java.io.InputStream
  8. import java.net.URL
  9. import java.nio.file.Path
  10. import kotlin.io.path.inputStream

  11. fun Any.serializeBytes(format: SerializationFormat): ByteArray =
  12.     format.serializeBytes(this)

  13. fun Any.serializeBytes(mediaType: MediaType): ByteArray =
  14.     this.serializeBytes(formatOf(mediaType))

  15. fun Any.serialize(format: SerializationFormat): String =
  16.     format.serialize(this)

  17. fun Any.serialize(mediaType: MediaType): String =
  18.     this.serialize(formatOf(mediaType))

  19. fun InputStream.parse(format: SerializationFormat): Any =
  20.     format.parse(this)

  21. fun InputStream.parse(mediaType: MediaType): Any =
  22.     parse(formatOf(mediaType))

  23. fun String.parse(format: SerializationFormat): Any =
  24.     this.toStream().parse(format)

  25. fun String.parse(mediaType: MediaType): Any =
  26.     this.toStream().parse(mediaType)

  27. fun File.parse(): Any =
  28.     this.inputStream().parse(mediaTypeOf(this))

  29. fun Path.parse(): Any =
  30.     this.inputStream().parse(mediaTypeOf(this))

  31. fun URL.parse(): Any =
  32.     this.openStream().parse(mediaTypeOf(this))

  33. fun File.parseMap(): Map<String, *> =
  34.     this.parse().castToMap()

  35. fun File.parseList(): List<*> =
  36.     this.parse().castToList()

  37. fun File.parseMaps(): List<Map<String, *>> =
  38.     this.parseList().map(Any?::castToMap)

  39. fun Path.parseMap(): Map<String, *> =
  40.     this.parse().castToMap()

  41. fun Path.parseList(): List<*> =
  42.     this.parse().castToList()

  43. fun Path.parseMaps(): List<Map<String, *>> =
  44.     this.parseList().map(Any?::castToMap)

  45. fun URL.parseMap(): Map<String, *> =
  46.     this.parse().castToMap()

  47. fun URL.parseList(): List<*> =
  48.     this.parse().castToList()

  49. fun URL.parseMaps(): List<Map<String, *>> =
  50.     this.parseList().map(Any?::castToMap)

  51. fun String.parseMap(format: SerializationFormat): Map<String, *> =
  52.     this.parse(format).castToMap()

  53. fun String.parseList(format: SerializationFormat): List<*> =
  54.     this.parse(format).castToList()

  55. fun String.parseMaps(format: SerializationFormat): List<Map<String, *>> =
  56.     this.parseList(format).map(Any?::castToMap)

  57. fun String.parseMap(mediaType: MediaType): Map<String, *> =
  58.     this.parse(mediaType).castToMap()

  59. fun String.parseList(mediaType: MediaType): List<*> =
  60.     this.parse(mediaType).castToList()

  61. fun String.parseMaps(mediaType: MediaType): List<Map<String, *>> =
  62.     this.parseList(mediaType).map(Any?::castToMap)

  63. fun InputStream.parseMap(format: SerializationFormat): Map<String, *> =
  64.     this.parse(format).castToMap()

  65. fun InputStream.parseList(format: SerializationFormat): List<*> =
  66.     this.parse(format).castToList()

  67. fun InputStream.parseMaps(format: SerializationFormat): List<Map<String, *>> =
  68.     this.parseList(format).map(Any?::castToMap)

  69. fun InputStream.parseMap(mediaType: MediaType): Map<String, *> =
  70.     this.parse(mediaType).castToMap()

  71. fun InputStream.parseList(mediaType: MediaType): List<*> =
  72.     this.parse(mediaType).castToList()

  73. fun InputStream.parseMaps(mediaType: MediaType): List<Map<String, *>> =
  74.     this.parseList(mediaType).map(Any?::castToMap)

  75. @Suppress("UNCHECKED_CAST") // Cast exception handled in function
  76. private fun Any?.castToMap(): Map<String, *> =
  77.     this as? Map<String, *> ?: error("$this cannot be cast to Map")

  78. private fun Any?.castToList(): List<*> =
  79.     this as? List<*> ?: error("$this cannot be cast to List")