Skip to content

Commit 5be1479

Browse files
committed
feat: support for omitzero added in Go 1.24
fixes #471
1 parent 735ea1c commit 5be1479

File tree

5 files changed

+157
-2
lines changed

5 files changed

+157
-2
lines changed

pkg/generator/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ type Config struct {
4242
DisableCustomTypesForMaps bool
4343
// AliasSingleAllOfAnyOfRefs will convert types with a single nested anyOf or allOf ref type into a type alias.
4444
AliasSingleAllOfAnyOfRefs bool
45+
// PreferOmitzero will use omit omitzero instead of omitempty, note this requires Go 1.24
46+
PreferOmitzero bool
4547
}
4648

4749
type SchemaMapping struct {

pkg/generator/schema_generator.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,11 +803,16 @@ func (g *schemaGenerator) addStructField(
803803

804804
tags := ""
805805

806-
if isRequired || g.DisableOmitempty() {
806+
switch {
807+
case isRequired || g.DisableOmitempty():
807808
for _, tag := range g.config.Tags {
808809
tags += fmt.Sprintf(`%s:"%s" `, tag, name)
809810
}
810-
} else {
811+
case g.config.PreferOmitzero:
812+
for _, tag := range g.config.Tags {
813+
tags += fmt.Sprintf(`%s:"%s,omitzero" `, tag, name)
814+
}
815+
default:
811816
for _, tag := range g.config.Tags {
812817
tags += fmt.Sprintf(`%s:"%s,omitempty" `, tag, name)
813818
}

tests/data/preferOmitzero/preferOmitzero.go

Lines changed: 89 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-04/schema#",
3+
"id": "https://example.com/primitives",
4+
"type": "object",
5+
"properties": {
6+
"myString": {
7+
"type": "string"
8+
},
9+
"myNumber": {
10+
"type": "number"
11+
},
12+
"myInteger": {
13+
"type": "integer"
14+
},
15+
"myBoolean": {
16+
"type": "boolean"
17+
},
18+
"myNull": {
19+
"type": "null"
20+
},
21+
"myStringArray": {
22+
"type": "array",
23+
"items": {
24+
"type": "string"
25+
}
26+
},
27+
"myNullArray": {
28+
"type": "array",
29+
"items": {
30+
"type": "null"
31+
}
32+
},
33+
"myObjectArray": {
34+
"type": "array",
35+
"items": {
36+
"type": "object"
37+
}
38+
},
39+
"myArray": {
40+
"type": "array"
41+
},
42+
"myMap": {
43+
"type": "object",
44+
"additionalProperties": {
45+
"type": "number"
46+
}
47+
}
48+
}
49+
}

tests/generation_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,16 @@ func TestAliasSingleAllOfAnyOfRefs(t *testing.T) {
235235
testExamples(t, cfg, "./data/aliasSingleAllOfAnyOfRefs")
236236
}
237237

238+
func TestPreferOmitzero(t *testing.T) {
239+
t.Parallel()
240+
241+
cfg := basicConfig
242+
cfg.PreferOmitzero = true
243+
cfg.Tags = []string{"json"}
244+
245+
testExamples(t, cfg, "./data/preferOmitzero")
246+
}
247+
238248
func TestSchemaExtensions(t *testing.T) {
239249
t.Parallel()
240250

0 commit comments

Comments
 (0)