swaggest / openapi-go

OpenAPI structures for Go
https://pkg.go.dev/github.com/swaggest/openapi-go/openapi3
MIT License
223 stars 18 forks source link

Better discriminator support? #85

Open danp opened 8 months ago

danp commented 8 months ago

Hi there, thanks for this family of modules.

I'm using this module to generate schema near existing HTTP handler code (like a minimal version of swaggest/rest). Trying to use oneOf in a request body which works fine using JSONSchemaOneOf. But I can't seem to crack an easy or straightforward way to set discriminator as described here.

I see that Schema has Discriminator on it but I'm not quite sure how to get there from something like this.

I tried implementing jsonschema.Preparer and Exposer but don't think I can influence discriminator that way.

Assuming I'm not missing something (apologies if I am!), would some better support for this be good? I could see discriminator tag support somewhere to set propertyName. But it would probably also be good to support mapping as well.

Happy to try putting a PR together if there's a direction you'd like to go.

Thanks again!

danp commented 8 months ago

If I dig into the spec after AddOperation I can do it in a roundabout way, eg:

c := ref.Spec.Components.Schemas.MapOfSchemaOrRefValues["SomethingUsingOneOf"]
c.Schema.WithDiscriminator(openapi3.Discriminator{PropertyName: "kind"})

But I have to know what name the component will end up with. And it would be nicer to do it closer to my handler and related types.