v2.5.0: No more optional pointers (optionally), omitzero, better control over initialisms, and so much more!
#2027
jamietanna
announced in
Announcements
Replies: 1 comment 1 reply
-
|
Thanks for keeping the minimum required Go version low, very much appreciated. |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
v2.5.0: No more optional pointers (optionally)!
🎉 Notable changes
Begone optional pointers! (optionally)
One of the key things
oapi-codegendoes is to use an "optional pointer", following idiomatic Go practices, to indicate that a field/type is optional.This can be tuned on a per-field basis, using the
x-go-type-skip-optional-pointerextension, but it can be a bit repetitive, or can be more complex when using an OpenAPI Overlay.As of
oapi-codegenv2.5.0, this can be tuned in two specific ways, via the following Output Options:prefer-skip-optional-pointer: a global default that you do not want the "optional pointer" generated. Optional fields will not have an "optional pointer", and will have anomitemptyJSON tagprefer-skip-optional-pointer-with-omitzero: when used in conjunction withprefer-skip-optional-pointer-with-omitzero, any optional fields are generated with anomitzeroJSON tag. Requires Go 1.24+In both cases, there is control on a per-field level to set
x-go-type-skip-optional-pointer: falseorx-omitzero: falseto undo these to field(s).Note
The default is not changing.
We take care to avoid breaking changes so this is, as many changes, an opt-in.
See Globally skipping the "optional pointer" for more details.
Generating
omitzeroJSON tags, withx-omitzeroRelated to the above functionality, it is possible to define the OpenAPI extension
x-omitzeroon fields to generate theomitzeroJSON tag, based on the (now not-so-new) Go 1.24 release.Thanks to @lzap for the contribution 🚀
Note
oapi-codegendoes not currently validate the Go version that the module it's generating code for.This could lead to the
omitzeroJSON tag being generated, but not being actually usable.Ensure that you're using a Go 1.24+ version, and that your
godirective (for source compatibility) isgo 1.24or i.e.go 1.24.1Using OpenAPI 3.1 with
oapi-codegenThere's some promising behind-the-scenes discussions with may lead to OpenAPI 3.1 support (#373) coming in the not-too-distant future 👀
In the meantime, Jamie (one of the Core Maintainers) has written a blog post about how to use
oapi-codegenwith OpenAPI 3.1 specs (by downgrading them to OpenAPI 3.0).Defining your own initialisms
As a means to define your own custom initialisms, it's possible to use the
additional-initialismsOutput Option.Thanks @micaelmalta for the contribution 🚀
If your organisation uses a lot of TLAs (Two Letter Acronyms or Three Letter Acronyms) or any other sorts of initialisms, it's handy to be able to configure these yourself.
For instance, if you regularly use the term CSP to refer to Cloud Service Provider, you may want
CSPto be used in variable names.This makes it possible to define i.e.
Note
This only works when the
name-normaliserOutput Option is set toToCamelCaseWithInitialisms. An error will occur if you've not configured this correctly.Minimum version of Go needed for oapi-codegen is now 1.22.5
As part of a couple of updates in #1888 and #1986, we're now requiring Go >= 1.22.5.
Similar to the bump to Go 1.21 in v2.4.0
Notable background work
Since the last
oapi-codegenrelease (all the way in September 2024 🥲) the following big changes towards the project and its ecosystem have been:net/httpmiddleware v1.1.0: Better error handling, allow not validatingServers(by configuration) and return an HTTP 405 Method Not Allowed where appropriateruntime: fixes formaps andx-go-type-skip-optional-pointer🚀 New features and improvements
Bytes()toClientWithResponsesresponses (feat(client): AddBytes()toClientWithResponsesresponses #1780) @grongorprefer-skip-optional-pointer-on-container-types(feat(output-options): addprefer-skip-optional-pointer-on-container-types#1979) @jamietannaprefer-skip-optional-pointerto default to skipping optional pointers (feat(output-options): addprefer-skip-optional-pointerto default to skipping optional pointers #1694) @aksdbyaml-tagsoption (feat(output-options): addyaml-tagsoption #1798) @deitchadditional-initialisms(feat: allow specifyingadditional-initialisms#1733) @micaelmalta🐛 Bug fixes
operationId(fix(codegen): allow exposing the input spec'soperationId#1945) @jamietannaprefer-skip-optional-pointerin reference types + add tests forpreferskipoptionalpointer(fix(output-options): obeyprefer-skip-optional-pointerin reference types + add tests forpreferskipoptionalpointer#2021) @jamietanna📝 Documentation updates
Responsemodels (docs(client): document known issue with duplicatedResponsemodels #2025) @jamietanna<details>blocks in<table>(docs(extensions): don't use<details>blocks in<table>#2019) @jamietannax-enumNames(docs(extensions): update example code forx-enumNames#2000) @jamietannanethttp-middlewarefor other purposes (docs(middleware): clarify use ofnethttp-middlewarefor other purposes #1951) @jamietannago toolfor Go 1.24+ (docs: add example of usinggo toolfor Go 1.24+ #1908) @jamietannatools.go(docs: note the use of a multi-moduletools.go#1788) @jamietanna👻 Maintenance
mainbranch please" (build(labels): add autolabeller for "nomainbranch please" #1847) @jamietannaprefer-skip-optional-pointerin reference types + add tests forpreferskipoptionalpointer(fix(output-options): obeyprefer-skip-optional-pointerin reference types + add tests forpreferskipoptionalpointer#2021) @jamietanna📦 Dependency updates
13 changes
Sponsors
We would like to thank our sponsors for their support during this release.
New contributors
We had 16 new contributors in this release, thanks folks 🚀
yaml-tagsoption #1798Bytes()toClientWithResponsesresponses #1780additional-initialisms#1733prefer-skip-optional-pointerto default to skipping optional pointers #1694This discussion was created from the release v2.5.0: No more optional pointers (optionally), `omitzero`, better control over initialisms, and so much more!.
Beta Was this translation helpful? Give feedback.
All reactions