fix omitempty for options

This commit is contained in:
Larsimusrex 2025-09-04 20:54:14 +02:00
parent 613bf43883
commit 98ffa233ea
2 changed files with 27 additions and 15 deletions

View file

@ -323,6 +323,19 @@ struct EncoderFieldInfo {
is_required bool
}
fn check_not_empty[T](val T) bool {
$if val is string {
if val == '' {
return false
}
} $else $if val is $int || val is $float {
if val == 0 {
return false
}
}
return true
}
@[unsafe]
fn (mut encoder Encoder) encode_struct[T](val T) {
encoder.output << `{`
@ -384,21 +397,17 @@ fn (mut encoder Encoder) encode_struct[T](val T) {
} else {
value := val.$(field.name)
if !field_info.is_required {
if field_info.is_omitempty {
$if value is $option {
if value == none {
write_field = false
}
write_field = check_not_empty(value)
} $else {
write_field = check_not_empty(value)
}
}
if field_info.is_omitempty {
$if value is string {
if value == '' {
write_field = false
}
} $else $if value is $int || value is $float {
if value == 0 {
if !field_info.is_required {
$if value is $option {
if value == none {
write_field = false
}
}

View file

@ -84,10 +84,13 @@ struct PointerFields {
type PointerFieldsAlias = PointerFields
struct OmitFields {
a ?bool @[omitempty]
b string @[omitempty]
c int @[omitempty]
d f64 @[omitempty]
a ?bool = none @[omitempty]
b string = '' @[omitempty]
c int = 0 @[omitempty]
d f64 = 0.0 @[omitempty]
e ?string = '' @[omitempty]
f ?int = 0 @[omitempty]
g ?f64 = 0.0 @[omitempty]
}
type OmitFieldsAlias = OmitFields