Skip to content

Commit

Permalink
fix(codegen): Fix code generated with headers using --force-pointers (#…
Browse files Browse the repository at this point in the history
…263)

Co-authored-by: Gildas Lebel <[email protected]>
  • Loading branch information
TheSadlig and GildasLebel authored Jan 20, 2025
1 parent 900a595 commit e9a7410
Show file tree
Hide file tree
Showing 13 changed files with 913 additions and 34 deletions.
2 changes: 1 addition & 1 deletion pkg/codegen/generators/v2/templates/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func OperationName(channel asyncapi.Channel) string {
}

var isFieldPointer = func(parent asyncapi.Schema, field string, schema asyncapi.Schema) bool {
return !IsRequired(parent, field) && schema.Type != "array"
return !(IsRequired(parent, field) || schema.IsRequired) && schema.Type != "array"
}

// ForcePointerOnFields is used to force the generation of all fields as pointers, except for arrays.
Expand Down
36 changes: 22 additions & 14 deletions pkg/codegen/generators/v2/templates/message.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,12 @@ func brokerMessageTo{{namify .Name}}(bMsg extensions.BrokerMessage) ({{namify .N
{{- end}}

{{- /* For each header */}}
{{- $headers := .Headers -}}
{{- range $key, $value := $headerProperties}}
case k == "{{$key}}": // Retrieving {{namify $key}} header
{{- if $value.IsRequired }}
{{- if isFieldPointer $headers $key $value }}
{{- if eq $value.Type "object" }}
err := json.Unmarshal(v, &msg.Headers.{{ namify $key}})
err := json.Unmarshal(v, msg.Headers.{{ namify $key}})
if err != nil {
return msg, err
}
Expand All @@ -120,13 +121,14 @@ func brokerMessageTo{{namify .Name}}(bMsg extensions.BrokerMessage) ({{namify .N
if err != nil {
return msg, err
}
msg.Headers.{{ namify $key}} = t
msg.Headers.{{ namify $key}} = &t
{{- else}}
msg.Headers.{{ namify $key}} = {{$value.Type}}(v)
h := {{$value.Type}}(v)
msg.Headers.{{ namify $key}} = &h
{{- end}}
{{- else}}
{{- if eq $value.Type "object" }}
err := json.Unmarshal(v, msg.Headers.{{ namify $key}})
err := json.Unmarshal(v, &msg.Headers.{{ namify $key}})
if err != nil {
return msg, err
}
Expand All @@ -135,10 +137,9 @@ func brokerMessageTo{{namify .Name}}(bMsg extensions.BrokerMessage) ({{namify .N
if err != nil {
return msg, err
}
msg.Headers.{{ namify $key}} = &t
msg.Headers.{{ namify $key}} = t
{{- else}}
h := {{$value.Type}}(v)
msg.Headers.{{ namify $key}} = &h
msg.Headers.{{ namify $key}} = {{$value.Type}}(v)
{{- end}}
{{- end}}
{{- end}}
Expand Down Expand Up @@ -198,7 +199,6 @@ func (msg {{namify .Name}}) toBrokerMessage() (extensions.BrokerMessage, error)

{{/* Handle headers, if defined */}}
{{ if .Headers -}}

{{- /* Get headers by reference, or not*/}}
{{- $headerProperties := .Headers.Properties}}
{{if .Headers.Reference }}
Expand All @@ -207,21 +207,29 @@ func (msg {{namify .Name}}) toBrokerMessage() (extensions.BrokerMessage, error)

// Add each headers to broker message
headers := make(map[string][]byte, {{ len $headerProperties }})

{{- $headers := .Headers -}}
{{/* For each header */ -}}
{{- range $key, $value := $headerProperties -}}
{{- range $key, $value := $headerProperties }}

// Adding {{ namify $key}} header
{{- if $value.IsRequired }}
{{- $dereferenceOp := "" -}}
{{- if isFieldPointer $headers $key $value -}}
{{- $dereferenceOp = "*" }}
if msg.Headers.{{ namify $key}} == nil {
return extensions.BrokerMessage{}, fmt.Errorf("field {{ namify $key}} should not be nil")
}
{{- end -}}
{{- if eq $value.Type "object" }}
h, err := json.Marshal(msg.Headers.{{ namify $key}})
h, err := json.Marshal({{ $dereferenceOp }}msg.Headers.{{ namify $key}})
if err != nil {
return extensions.BrokerMessage{}, err
}
headers["{{$key}}"] = h
{{- else if isDateOrDateTimeGenerated $value.Format }}
headers["{{$key}}"] = []byte(msg.Headers.{{namify $key}}.Format(time.RFC3339))
headers["{{$key}}"] = []byte({{ $dereferenceOp }}msg.Headers.{{namify $key}}.Format(time.RFC3339))
{{- else }}
headers["{{$key}}"] = []byte(msg.Headers.{{namify $key}})
headers["{{$key}}"] = []byte({{ $dereferenceOp }}msg.Headers.{{namify $key}})
{{- end }}
{{- else}}
if msg.Headers.{{namify $key}} != nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/codegen/generators/v3/templates/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ func GenerateChannelAddr(ch *asyncapi.Channel) string {
}

var isFieldPointer = func(parent asyncapi.Schema, field string, schema asyncapi.Schema) bool {
return !IsRequired(parent, field) && schema.Type != "array"
return !(IsRequired(parent, field) || schema.IsRequired) && schema.Type != "array"
}

// ForcePointerOnFields is used to force the generation of all fields as pointers, except for arrays.
Expand Down
39 changes: 24 additions & 15 deletions pkg/codegen/generators/v3/templates/message.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,12 @@ func brokerMessageTo{{namify .Name}}(bMsg extensions.BrokerMessage) ({{namify .N
{{- end}}

{{- /* For each header */}}
{{- $headers := .Headers -}}
{{- range $key, $value := $headerProperties}}
case k == "{{$key}}": // Retrieving {{namify $key}} header
{{- if $value.IsRequired }}
{{- if isFieldPointer $headers $key $value }}
{{- if eq $value.Type "object" }}
err := json.Unmarshal(v, &msg.Headers.{{ namify $key}})
err := json.Unmarshal(v, msg.Headers.{{ namify $key}})
if err != nil {
return msg, err
}
Expand All @@ -129,17 +130,18 @@ func brokerMessageTo{{namify .Name}}(bMsg extensions.BrokerMessage) ({{namify .N
if err != nil {
return msg, err
}
msg.Headers.{{ namify $key}} = t
msg.Headers.{{ namify $key}} = &t
{{- else}}
{{- if $value.Reference }}
msg.Headers.{{ namify $key}} = {{$value.ReferenceTo.Name}}(v)
h := {{$value.ReferenceTo.Name}}(v)
{{- else }}
msg.Headers.{{ namify $key}} = {{$value.Type}}(v)
h := {{$value.Type}}(v)
{{- end}}
msg.Headers.{{ namify $key}} = &h
{{- end}}
{{- else}}
{{- if eq $value.Type "object" }}
err := json.Unmarshal(v, msg.Headers.{{ namify $key}})
err := json.Unmarshal(v, &msg.Headers.{{ namify $key}})
if err != nil {
return msg, err
}
Expand All @@ -148,14 +150,13 @@ func brokerMessageTo{{namify .Name}}(bMsg extensions.BrokerMessage) ({{namify .N
if err != nil {
return msg, err
}
msg.Headers.{{ namify $key}} = &t
msg.Headers.{{ namify $key}} = t
{{- else}}
{{- if $value.Reference }}
h := {{$value.ReferenceTo.Name}}(v)
msg.Headers.{{ namify $key}} = {{$value.ReferenceTo.Name}}(v)
{{- else }}
h := {{$value.Type}}(v)
msg.Headers.{{ namify $key}} = {{$value.Type}}(v)
{{- end}}
msg.Headers.{{ namify $key}} = &h
{{- end}}
{{- end}}
{{- end}}
Expand Down Expand Up @@ -224,21 +225,29 @@ func (msg {{namify .Name}}) toBrokerMessage() (extensions.BrokerMessage, error)

// Add each headers to broker message
headers := make(map[string][]byte, {{ len $headerProperties }})

{{- $headers := .Headers -}}
{{/* For each header */ -}}
{{- range $key, $value := $headerProperties -}}
{{- range $key, $value := $headerProperties }}

// Adding {{ namify $key}} header
{{- if $value.IsRequired }}
{{- $dereferenceOp := "" -}}
{{- if isFieldPointer $headers $key $value -}}
{{- $dereferenceOp = "*" }}
if msg.Headers.{{ namify $key}} == nil {
return extensions.BrokerMessage{}, fmt.Errorf("field {{ namify $key}} should not be nil")
}
{{- end -}}
{{- if eq $value.Type "object" }}
h, err := json.Marshal(msg.Headers.{{ namify $key}})
h, err := json.Marshal({{ $dereferenceOp }}msg.Headers.{{ namify $key}})
if err != nil {
return extensions.BrokerMessage{}, err
}
headers["{{$key}}"] = h
{{- else if isDateOrDateTimeGenerated $value.Format }}
headers["{{$key}}"] = []byte(msg.Headers.{{namify $key}}.Format(time.RFC3339))
headers["{{$key}}"] = []byte({{ $dereferenceOp }}msg.Headers.{{namify $key}}.Format(time.RFC3339))
{{- else }}
headers["{{$key}}"] = []byte(msg.Headers.{{namify $key}})
headers["{{$key}}"] = []byte({{ $dereferenceOp }}msg.Headers.{{namify $key}})
{{- end }}
{{- else}}
if msg.Headers.{{namify $key}} != nil {
Expand Down
Loading

0 comments on commit e9a7410

Please sign in to comment.