zio / zio-http

A next-generation Scala framework for building scalable, correct, and efficient HTTP clients and servers
https://zio.dev/zio-http
Apache License 2.0
802 stars 406 forks source link

Automatic examples for OpenAPIGen #3196

Open barthorre opened 3 weeks ago

barthorre commented 3 weeks ago

Is your feature request related to a problem? Please describe.

When using zio-schema to define an input message for a POST endpoint, I don't want to have to define example(s) for the OpenAPI swagger manually.

Describe the solution you'd like

I would like the OpenAPIGen to have an option to generate examples based on the default value of a zio-schema.

Describe alternatives you've considered

As an alternative I have added the default values of my zio-schema's as examples to the Endpoint definition.

Additional context

I am working with proto specs, which get translated through scalapb to zio-schema's. Consider this example:

message Message {
  string id = 1;
  oneof data {
    Data1 one = 2;  
    Data2 two = 3;
  }
}

It would be really nice of I could generate 2 example requests on the swagger endpoint automatically, one for each entry in the enum.

The workaround defined above is using something like this

    case record: Schema.Record[_] =>
      record.fields.find(_.fieldName == "data").toList.flatMap { field =>
        field.schema match {
          case enum: Schema.Enum[_] => `enum`.cases.flatMap { cse =>
              cse.schema.defaultValue.toOption.flatMap {
                case a: Message.Data    => Some(cse.id -> Message.of("id", a))
              }
            }
          case _ => throw new RuntimeException("Expected enum")
        }
      }
    case _ => throw new RuntimeException("Expected record")
  }

val endpoint =  Endpoint(RoutePattern.POST / "message").in[Message].examplesIn(examples: _*).out[String]
  OpenAPIGen.fromEndpoints("API", "1.0.0", endpoint))
jdegoes commented 2 weeks ago

/bounty $250 for basic implementation that works off Schema and can handle any Schema but which does not generate meaningful information (e.g. strings are just alphanumeric, etc., regardless of field name).

algora-pbc[bot] commented 2 weeks ago

💎 $250 bounty • ZIO

Steps to solve:

  1. Start working: Comment /attempt #3196 with your implementation plan
  2. Submit work: Create a pull request including /claim #3196 in the PR body to claim the bounty
  3. Receive payment: 100% of the bounty is received 2-5 days post-reward. Make sure you are eligible for payouts

Thank you for contributing to zio/zio-http!

Add a bountyShare on socials