Skip to content

Allow overriding primitive types with custom types#428

Closed
natsukagami wants to merge 4 commits intooapi-codegen:mainfrom
curvegrid:nullable-overrides
Closed

Allow overriding primitive types with custom types#428
natsukagami wants to merge 4 commits intooapi-codegen:mainfrom
curvegrid:nullable-overrides

Conversation

@natsukagami
Copy link
Copy Markdown
Contributor

Short Description

Allow primitive types (ints, floats, string types) to be replaced with an option, primitive-mapping, in the YAML configuration.

Motivation

Sometimes it is desirable to use a custom wrappers or different types entirely for the hard-coded types generated in oapi-codegen.
One of such reasons is for tighter controls over JSON marshalling (e.g. check for missing fields or perform some custom validation).

This can already be done with x-go-type extension tag, but it is very painful to do for e.g. every integer parameter in the whole YAML spec.

What has changed?

This is not a breaking change, no code generation change is made if there is no configuration change.

  • A lot of functions now take the *Options object as an additional parameter.
  • A new option has been added, primitive-mapping, which maps the primitive type to the actual type (int32 => null.Int32 for example).
  • README has been updated to inform users of the new functionality.

Note that primitive-mapping is only available in the YAML configuration at the moment (no flags). I am not sure if it is desirable to add the flags / what is the best way to do it, so I left it out.

@jamietanna
Copy link
Copy Markdown
Member

@deepmap-marcinr is this one we can take inspiration from / will be replaced by your work in the v2 side of things?

@jamietanna jamietanna reopened this Jan 25, 2024
@jamietanna
Copy link
Copy Markdown
Member

Apologies, meant to close #458 🫣

danicc097 pushed a commit to danicc097/oapi-codegen that referenced this pull request Aug 31, 2024
As noted in oapi-codegen#428, there are some cases where it can be useful to set the
field ordering.

This adds support for the `x-order` extension used by other OpenAPI
parsers and generators, and ensures that we return keys sorted by that
order, if present.

This also adds a relevant test case + unit tests to validate
functionality.

Closes oapi-codegen#428.

Co-authored-by: Filinto Duran <filinto@diagrid.io>
Signed-off-by: Filinto Duran <filinto@diagrid.io>
Co-authored-by: Andrew Rusakow <psihatter@gmail.com>
Co-authored-by: Jamie Tanna <jamie@jamietanna.co.uk>
mromaszewicz added a commit to mromaszewicz/oapi-codegen that referenced this pull request Feb 14, 2026
Supersedes oapi-codegen#428, since the original author's branch is gone and
his PR only exists in the ref log.

Added a TypeMapping configuration that lets users override the default
OpenAPI type/format to Go type mappings. User-specified mappings are
merged on top of built-in defaults, so only overrides need to be
specified. For example, mapping string/date-time to a civil.DateTime
or changing the default integer type to int64.

Changes:
- New TypeMapping, FormatMapping, SimpleTypeSpec types with Merge()
  and Resolve() methods (pkg/codegen/typemapping.go)
- TypeMapping field added to Configuration struct
- Merged type mapping stored on globalState, initialized in Generate()
- Replaced hardcoded switch statements in oapiSchemaToGoType() with
  map-based lookups via globalState.typeMapping
- Updated configuration-schema.json with type-mapping property and
  reusable $defs for format-mapping and simple-type-spec
- Unit tests for merge, resolve, and default mapping completeness

Co-Authored-By: natsukagami <natsukagami@gmail.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@mromaszewicz
Copy link
Copy Markdown
Member

Thank you for doing this @natsukagami . I tried to fix up this commit to be compatible with the current code, which has diverged greatly since when you originally submitted it, but I can't update your PR since the linked branch now contains many other changes, and i don't want to break your work. I've made a new PR, which does the same thing but is implemented differently as #2223 and made you a co-author.

@natsukagami
Copy link
Copy Markdown
Contributor Author

No worries! It's been a long time since my PR and I don't personally use oapi-codegen anymore, so it's great to have someone take over the changes!

mromaszewicz added a commit to mromaszewicz/oapi-codegen that referenced this pull request Feb 15, 2026
Supersedes oapi-codegen#428, since the original author's branch is gone and
his PR only exists in the ref log.

Added a TypeMapping configuration that lets users override the default
OpenAPI type/format to Go type mappings. User-specified mappings are
merged on top of built-in defaults, so only overrides need to be
specified. For example, mapping string/date-time to a civil.DateTime
or changing the default integer type to int64.

Changes:
- New TypeMapping, FormatMapping, SimpleTypeSpec types with Merge()
  and Resolve() methods (pkg/codegen/typemapping.go)
- TypeMapping field added to Configuration struct
- Merged type mapping stored on globalState, initialized in Generate()
- Replaced hardcoded switch statements in oapiSchemaToGoType() with
  map-based lookups via globalState.typeMapping
- Updated configuration-schema.json with type-mapping property and
  reusable $defs for format-mapping and simple-type-spec
- Unit tests for merge, resolve, and default mapping completeness

Co-Authored-By: natsukagami <natsukagami@gmail.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
mromaszewicz added a commit that referenced this pull request Feb 16, 2026
* feat: add configurable type mapping for OpenAPI primitive types

Supersedes #428, since the original author's branch is gone and
his PR only exists in the ref log.

Added a TypeMapping configuration that lets users override the default
OpenAPI type/format to Go type mappings. User-specified mappings are
merged on top of built-in defaults, so only overrides need to be
specified. For example, mapping string/date-time to a civil.DateTime
or changing the default integer type to int64.

Changes:
- New TypeMapping, FormatMapping, SimpleTypeSpec types with Merge()
  and Resolve() methods (pkg/codegen/typemapping.go)
- TypeMapping field added to Configuration struct
- Merged type mapping stored on globalState, initialized in Generate()
- Replaced hardcoded switch statements in oapiSchemaToGoType() with
  map-based lookups via globalState.typeMapping
- Updated configuration-schema.json with type-mapping property and
  reusable $defs for format-mapping and simple-type-spec
- Unit tests for merge, resolve, and default mapping completeness

Co-Authored-By: natsukagami <natsukagami@gmail.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Move TypeMapping to OutputOptions

* Add example for type-mapping

* Address PR feedback

Move type-mapping examples to output-options

---------

Co-authored-by: natsukagami <natsukagami@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants