danielgtaylor / danielgtaylor/huma

Primitive-based types are not reused in the generated OAS.

Open
#560 3 comments 0 reactions 0 assignees View on GitHub
question
Dominant language
Go
Stars
4.4k
Forks
285
Avg merge
40m
Merged PRs (30d)
1

Description

Hey there!

I've got the following types

```go

var _ huma.SchemaTransformer = CustomHeader("")

type CustomHeader string

func (h CustomHeader) TransformSchema(r huma.Registry, s *huma.Schema) *huma.Schema {
s.Type = "string"
s.Description = "Custom header Description. The CustomHeader schema should be reused across all endpoints that use it."
return s
}

type CreateUser struct {
Body struct {
Name string `json:"name" doc:"The name."`
}

CustomHeader CustomHeader `header:"X-Custom-Header"`
}

type UpdateUser struct {
Body struct {
Name string `json:"name" doc:"The name."`
}

CustomHeader CustomHeader `header:"X-Custom-Header"`
}

type Output struct {
Body struct {
Message string `json:"message" doc:"The message."`
}
}
```

With the following routes
```go
huma.Post(api, "/user", func(ctx context.Context, req *CreateUser) (*Output, error) {
resp := &Output{}
resp.Body.Message = "It works!"
return resp, nil
})

huma.Patch(api, "/user/{id}", func(ctx context.Context, req *UpdateUser) (*Output, error) {
resp := &Output{}
resp.Body.Message = "It works!"
return resp, nil
}}
```

I expect that `CustomHeader` would be re-used via `$ref` in the generated OAS.

Instead the `CustomHeader` schema is embedded into all the endpoints

```yaml
paths:
/user:
post:
operationId: post-user
parameters:
- description: Custom header Description. The CustomHeader schema should be reused across all endpoints that use it.
in: header
name: X-Custom-Header
schema:
description: Custom header Description. The CustomHeader schema should be reused across all endpoints that use it.
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateUserBody"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/OutputBody"
description: OK
default:
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ErrorModel"
description: Error
summary: Post user
/user/{id}:
patch:
operationId: patch-user-by-id
parameters:
- description: Custom header Description. The CustomHeader schema should be reused across all endpoints that use it.
in: header
name: X-Custom-Header
schema:
description: Custom header Description. The CustomHeader schema should be reused across all endpoints that use it.
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateUserBody"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/OutputBody"
description: OK
default:
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ErrorModel"
description: Error
summary: Patch user by ID
```

Can an operation be registered to force Huma to reuse shared schemas?

Thank you.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.