ogen-go / ogen

OpenAPI v3 code generator for go

Home Page:https://ogen.dev

Repository from Github https://github.comogen-go/ogenRepository from Github https://github.comogen-go/ogen

Support custom `format` types.

abemedia opened this issue · comments

Description

I'd like to propose adding support for custom format types. These could come from the configuration. Maybe something like the following example:

generator:
  formats:
    decimal: github.com/shopspring/decimal.Decimal

This would result in a field with format: decimal to be of the type decimal.Decimal from the package github.com/shopspring/decimal.

Alternatively, we could implement this as an extension e.g.

type: string
x-ogen-type: github.com/shopspring/decimal.Decimal

We can implement some checks to ensure the package is importable, as well as checking that the type implements one of the following interfaces:

interface {
  Encode(e *jx.Encoder)
  Decode(d *jx.Decoder) error
}
interface {
  json.Marshaler
  json.Unmarshaler
}
interface {
  encoding.TextMarshaler
  encoding.TextUnmarshaler
}

Based on which of the interfaces it implements we can use a different template for encoding and decoding the value.

I'm happy to implement this feature, just wanted to first check if such a feature would be accepted and get alignment on the way it's configured.

I'm happy to implement this feature, just wanted to first check if such a feature would be accepted and get alignment on the way it's configured.

It would be nice. This feature was requested before.

I think it is better to configure it via extension x-go-type, since it also used by oapi-codegen
and go-swagger.

Thanks for getting back to me on this @tdakkota!

Both oapi-codegen and go-swagger use different formats though:

oapi-codegen

x-go-type: googleuuid.UUID
x-go-type-import:
  path: github.com/google/uuid
  name: googleuuid

go-swagger

x-go-type:
  import:
    package: github.com/google/uuid
    alias: googleuuid
  type: UUID

I personally still prefer the idea of writing a single field e.g.

x-go-type: github.com/google/uuid.UUID

We could also automatically alias it if there's a clash between package names.

What's your preference?

I personally still prefer the idea of writing a single field e.g.

x-go-type: github.com/google/uuid.UUID

Me too.
I didn't notice that oapi-codegen requires a x-go-type-import. In that case, let's keep it x-ogen-type.

Any news on this issue, it would be nice to see this implemented?

commented

It would be really cool.

I’m also really looking forward to it, I’ve been following this issue for a long time

Hey guys, will likely be able to dedicate some time to this in the coming week.