diff --git a/.gitignore b/.gitignore index 821faf04..49208142 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ .tags .attach_pid* metals.sbt -.vscode \ No newline at end of file +.vscode +.bsp \ No newline at end of file diff --git a/modules/swagger/src/main/scala/ru/tinkoff/tschema/swagger/AsOpenApiParam.scala b/modules/swagger/src/main/scala/ru/tinkoff/tschema/swagger/AsOpenApiParam.scala index 59596144..9d79f81a 100644 --- a/modules/swagger/src/main/scala/ru/tinkoff/tschema/swagger/AsOpenApiParam.scala +++ b/modules/swagger/src/main/scala/ru/tinkoff/tschema/swagger/AsOpenApiParam.scala @@ -27,6 +27,9 @@ object AsOpenApiParam extends AsOpenParamInstances[AsOpenApiParam] with Derivati def generate[T]: Typeclass[T] = macro Magnolia.gen[T] def instance[T]: Typeclass[T] = macro Magnolia.gen[T] + + implicit def optParam[T](implicit param: AsOpenApiParam[T]): AsOpenApiParam[Option[T]] = + param.optional } trait OpenApiParamInfo { @@ -46,10 +49,12 @@ final case class AsSingleOpenApiParam[T](typ: SwaggerType, required: Boolean = t def optional: AsOpenApiParam[Option[T]] = AsSingleOpenApiParam(typ, required = false) } -object AsSingleOpenApiParam extends AsOpenParamInstances[AsSingleOpenApiParam] +object AsSingleOpenApiParam extends AsOpenParamInstances[AsSingleOpenApiParam] { + final implicit def optSingleParam[T](implicit typ: SwaggerTypeable[T]): AsSingleOpenApiParam[Option[T]] = + AsSingleOpenApiParam[Option[T]](typ = typ.typ, required = false) +} trait AsOpenParamInstances[TC[x] >: AsSingleOpenApiParam[x]] { - final implicit def requiredParam[T](implicit typ: SwaggerTypeable[T]): TC[T] = + final implicit def requiredSingleParam[T](implicit typ: SwaggerTypeable[T]): TC[T] = AsSingleOpenApiParam[T](typ = typ.typ, required = true) - final implicit def optParam[T](implicit param: AsOpenApiParam[T]): AsOpenApiParam[Option[T]] = param.optional -} +} \ No newline at end of file diff --git a/modules/swagger/src/test/scala/ru/tinkoff/tschema/swagger/MkSwaggerSpec.scala b/modules/swagger/src/test/scala/ru/tinkoff/tschema/swagger/MkSwaggerSpec.scala index f212e609..e79a2525 100644 --- a/modules/swagger/src/test/scala/ru/tinkoff/tschema/swagger/MkSwaggerSpec.scala +++ b/modules/swagger/src/test/scala/ru/tinkoff/tschema/swagger/MkSwaggerSpec.scala @@ -59,4 +59,18 @@ class MkSwaggerSpec extends AnyFlatSpec { assert((foo ++ bar).describe(description).make(OpenApiInfo()).tags == output) } + + "optional header" should "has required = false in OpenAPI" in { + val swagger = MkSwagger( + ( + tag("tag") :> + get :> + operation("operation") :> + header[Option[String]]("X-Kek-Id") :> + $$[String] + ) + ) + + assert(!swagger.paths.head.op.parameters.find(_.name == "X-Kek-Id").get.required) + } }