All Downloads are FREE. Search and download functionalities are using the official Maven repository.

alloy.openapi.ExternalDocumentationMapper.scala Maven / Gradle / Ivy

There is a newer version: 0.3.14
Show newest version
/* Copyright 2022 Disney Streaming
 *
 * Licensed under the Tomorrow Open Source Technology License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    https://disneystreaming.github.io/TOST-1.0.txt
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package alloy.openapi

import _root_.software.amazon.smithy.jsonschema.JsonSchemaConfig
import _root_.software.amazon.smithy.jsonschema.JsonSchemaMapper
import _root_.software.amazon.smithy.jsonschema.Schema.Builder
import _root_.software.amazon.smithy.model.shapes.Shape

import scala.jdk.CollectionConverters._
import software.amazon.smithy.model.traits.ExternalDocumentationTrait
import software.amazon.smithy.model.node.ObjectNode
import software.amazon.smithy.openapi.fromsmithy.OpenApiMapper
import software.amazon.smithy.openapi.fromsmithy.Context
import software.amazon.smithy.openapi.model.OpenApi
import software.amazon.smithy.model.shapes.OperationShape
import software.amazon.smithy.openapi.model.OperationObject
import software.amazon.smithy.model.traits.Trait
import software.amazon.smithy.openapi.model.ExternalDocumentation

class ExternalDocumentationMapperOpenApi() extends OpenApiMapper {

  override def after(context: Context[_ <: Trait], openapi: OpenApi): OpenApi =
    if (context.getService.hasTrait(classOf[ExternalDocumentationTrait])) {
      context.getService
        .expectTrait(classOf[ExternalDocumentationTrait])
        .getUrls()
        .asScala
        .headOption match {
        case Some((name, url)) =>
          openapi
            .toBuilder()
            .extensions(
              ObjectNode
                .builder()
                .withMember(
                  "externalDocs",
                  ObjectNode
                    .builder()
                    .withMember("description", name)
                    .withMember("url", url)
                    .build()
                )
                .build()
            )
            .build()
        case _ => openapi
      }
    } else openapi

  override def updateOperation(
      context: Context[_ <: Trait],
      shape: OperationShape,
      operation: OperationObject,
      httpMethodName: String,
      path: String
  ): OperationObject =
    if (shape.hasTrait(classOf[ExternalDocumentationTrait])) {
      shape
        .expectTrait(classOf[ExternalDocumentationTrait])
        .getUrls()
        .asScala
        .headOption match {
        case Some((name, url)) =>
          operation
            .toBuilder()
            .externalDocs(
              ExternalDocumentation.builder.description(name).url(url).build()
            )
            .build()
        case _ => operation
      }
    } else operation

}

class ExternalDocumentationMapperJsonSchema() extends JsonSchemaMapper {

  override def updateSchema(
      shape: Shape,
      schemaBuilder: Builder,
      config: JsonSchemaConfig
  ): Builder = if (shape.hasTrait(classOf[ExternalDocumentationTrait])) {
    shape
      .expectTrait(classOf[ExternalDocumentationTrait])
      .getUrls()
      .asScala
      .headOption match {
      case Some((name, url)) =>
        val res = ObjectNode
          .builder()
          .withMember("description", name)
          .withMember("url", url)
          .build()
        schemaBuilder.putExtension("externalDocs", res)
      case _ => schemaBuilder
    }
  } else schemaBuilder
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy