MediaType.kt

  1. package com.hexagonkt.core.media

  2. import com.hexagonkt.core.assertEnabled
  3. import com.hexagonkt.core.media.MediaTypeGroup.ANY

  4. /**
  5.  * Media type (also known as MIME type).
  6.  */
  7. data class MediaType(
  8.     val group: MediaTypeGroup,
  9.     val type: String,
  10. ) {
  11.     val fullType: String = if (group == ANY) "*/$type" else "${group.text}/$type"

  12.     init {
  13.         if (assertEnabled)
  14.             require(type.matches(MEDIA_TYPE_FORMAT)) {
  15.                 "Type must match '$MEDIA_TYPE_FORMAT': $type"
  16.             }
  17.     }

  18.     companion object {
  19.         val fullTypes: Map<String, MediaType> by lazy {
  20.             MEDIA_TYPES_EXTENSIONS.values.toSet().associateBy { it.fullType }
  21.         }

  22.         operator fun get(extension: String): MediaType =
  23.             MEDIA_TYPES_EXTENSIONS[extension] ?: DEFAULT_MEDIA_TYPE

  24.         operator fun invoke(fullType: String): MediaType =
  25.             fullTypes[fullType] ?: parseMediaType(fullType)
  26.     }
  27. }