Enrichment

Kompendium allows users to enrich their data types with additional information. This can be done by defining a TypeEnrichment object and passing it to the enrichment parameter of the relevant requestType or responseType.

data class SimpleData(val a: String, val b: Int? = null)

val myEnrichment = TypeEnrichment<SimpleData>(id = "simple-enrichment") {
  SimpleData::a {
    description = "This will update the field description"
  }
  SimpleData::b {
    // Will indicate in the UI that the field will be removed soon
    deprecated = true
  }
}

// In your route documentation
fun Routing.enrichedSimpleRequest() {
  route("/example") {
    install(NotarizedRoute()) {
      parameters = TestModules.defaultParams
      post = PostInfo.builder {
        summary(TestModules.defaultPathSummary)
        description(TestModules.defaultPathDescription)
        request {
          requestType<SimpleData>(enrichment = myEnrichment) // Simply attach the enrichment to the request
          description("A test request")
        }
        response {
          responseCode(HttpStatusCode.Created)
          responseType<TestCreatedResponse>()
          description(TestModules.defaultResponseDescription)
        }
      }
    }
  }
}

An enrichment must provide an id field that is unique to the data class that is being enriched. This is because under the hood, Kompendium appends this id to the data class identifier in order to support multiple different enrichments on the same data class.

If you provide duplicate ids, all but the first enrichment will be ignored, as Kompendium will view that as a cache hit, and skip analyzing the new enrichment.

Nested Enrichments

Enrichments are portable and composable, meaning that we can take an enrichment for a child data class and apply it inside a parent data class using the typeEnrichment property.

data class ParentData(val a: String, val b: ChildData)
data class ChildData(val c: String, val d: Int? = null)

val childEnrichment = TypeEnrichment<ChildData>(id = "child-enrichment") {
  ChildData::c {
    description = "This will update the field description of field c on child data"
  }
  ChildData::d {
    description = "This will update the field description of field d on child data"
  }
}

val parentEnrichment = TypeEnrichment<ParentData>(id = "parent-enrichment") {
  ParentData::a {
    description = "This will update the field description"
  }
  ParentData::b {
    description = "This will update the field description of field b on parent data"
    typeEnrichment = childEnrichment // Will apply the child enrichment to the internals of field b
  }
}

Available Enrichments

All enrichments support the following properties:

  • description -> Provides a reader friendly description of the field in the object

  • deprecated -> Indicates that the field is deprecated and should not be used

String

  • minLength -> The minimum length of the string

  • maxLength -> The maximum length of the string

  • pattern -> A regex pattern that the string must match

  • contentEncoding -> The encoding of the string

  • contentMediaType -> The media type of the string

Numbers

  • minimum -> The minimum value of the number

  • maximum -> The maximum value of the number

  • exclusiveMinimum -> Indicates that the minimum value is exclusive

  • exclusiveMaximum -> Indicates that the maximum value is exclusive

  • multipleOf -> Indicates that the number must be a multiple of the provided value

Arrays

  • minItems -> The minimum number of items in the array

  • maxItems -> The maximum number of items in the array

  • uniqueItems -> Indicates that the array must contain unique items

Last updated