Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion pkg/asyncapi/v2/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,10 @@ func NewSchema() Schema {

// generateMetadata generates metadata for the schema and its children.
func (s *Schema) generateMetadata(name string, isRequired bool) error {
s.Name = template.Namify(name)
// Do not set name if this is a reference - it will be resolved later
if s.Reference == "" {
s.Name = template.Namify(name)
}

// Generate Properties metadata
if err := s.generatePropertiesMetadata(); err != nil {
Expand Down
17 changes: 17 additions & 0 deletions pkg/codegen/generators/v2/templates/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,22 @@ func ForcePointerOnFields() {
}
}

// ExtractSchemaNameFromReference extracts schema name from reference path like "#/components/schemas/TestCreatedEvent".
func ExtractSchemaNameFromReference(ref string) string {
if ref == "" {
return ""
}

// Split by "/" and get the last part
parts := strings.Split(ref, "/")
if len(parts) == 0 {
return ""
}

schemaName := parts[len(parts)-1]
return templateutil.Namify(schemaName) + "Schema"
}

// HelpersFunctions returns the functions that can be used as helpers
// in a golang template.
func HelpersFunctions() template.FuncMap {
Expand All @@ -166,5 +182,6 @@ func HelpersFunctions() template.FuncMap {
"referenceToTypeName": ReferenceToTypeName,
"generateValidateTags": generators.GenerateValidateTags[asyncapi.Schema],
"generateJSONTags": generators.GenerateJSONTags[asyncapi.Schema],
"extractSchemaNameFromReference": ExtractSchemaNameFromReference,
}
}
55 changes: 31 additions & 24 deletions pkg/codegen/generators/v2/templates/schema_name.tmpl
Original file line number Diff line number Diff line change
@@ -1,9 +1,39 @@
{{define "schema-name" -}}

{{- /* ------------------------- Custom Go type ------------------------- */ -}}
{{- if .ExtGoType -}}
{{ .ExtGoType }}

{{- /* ---------------------------- Reference (highest priority) ------- */ -}}
{{- else if .ReferenceTo -}}
{{ namify .ReferenceTo.Name }}

{{- /* ----------------------- Reference without ReferenceTo (fallback) ---- */ -}}
{{- else if .Reference -}}
{{ extractSchemaNameFromReference .Reference }}

{{- /* ------------------------- AllOf schema ------------------------- */ -}}
{{- else if .AllOf -}}
{{ namify .Name }}

{{- /* ------------------------- AnyOf or OneOf ------------------------- */ -}}
{{- else if or .AnyOf .OneOf -}}
{{$xxxOf := $.AnyOf}}{{- if .OneOf }}{{$xxxOf = $.OneOf}}{{end -}}

struct {
{{- if .OneOf }}
// WARNING: only one of the following field can be used
{{ end }}

{{- range $key, $value := $xxxOf}}
// {{ if $value.Reference}}{{ .ReferenceTo.Name }}{{else}}AnyOf{{$key}}{{end}}
{{- if $value.Description}}
// Description: {{multiLineComment $value.Description}}
{{- end}}
{{ if $value.Reference}}{{ .ReferenceTo.Name }}{{else}}AnyOf{{$key}}{{end}} *{{template "schema-name" $value}}
{{end -}}
}

{{- /* ------------------------- Type handling ------------------------- */ -}}
{{- else if .Type -}}

{{- /* --------------------------- Type Object -------------------------- */ -}}
Expand Down Expand Up @@ -49,31 +79,8 @@ float64
// WARNING: no generation occured here as it has unknown type '{{.Type}}'
{{- end -}}

{{- /* ------------------------- AnyOf or OneOf ------------------------- */ -}}
{{- else if or .AnyOf .OneOf -}}
{{$xxxOf := $.AnyOf}}{{- if .OneOf }}{{$xxxOf = $.OneOf}}{{end -}}

struct {
{{- if .OneOf }}
// WARNING: only one of the following field can be used
{{ end }}

{{- range $key, $value := $xxxOf}}
// {{ if $value.Reference}}{{ .ReferenceTo.Name }}{{else}}AnyOf{{$key}}{{end}}
{{- if $value.Description}}
// Description: {{multiLineComment $value.Description}}
{{- end}}
{{ if $value.Reference}}{{ .ReferenceTo.Name }}{{else}}AnyOf{{$key}}{{end}} *{{template "schema" $value}}
{{end -}}
}

{{- /* ---------------------------- Reference --------------------------- */ -}}
{{- else if .ReferenceTo -}}
{{ namify .Follow.Name }}

{{- /* ----------------------- Unsupported use case ---------------------- */ -}}
{{- else -}}
interface{}
// WARNING: potential error in AsyncAPI generation
// Infos on type: {{ describeStruct . }}
{{- end -}}
Expand Down
Loading