@@ -362,6 +362,47 @@ func (g *Generator) notZeroCheck(t reflect.Type, v string) string {
362362 }
363363}
364364
365+ func (g * Generator ) notEmptyOrZeroCheck (t reflect.Type , v string ) string {
366+ isDefinedIface := reflect .TypeOf ((* easyjson .Optional )(nil )).Elem ()
367+ implementsIsDefined := reflect .PtrTo (t ).Implements (isDefinedIface )
368+ isZeroIface := reflect .TypeOf ((* easyjson .IsZero )(nil )).Elem ()
369+ implementsIsZero := reflect .PtrTo (t ).Implements (isZeroIface )
370+
371+ if implementsIsDefined && implementsIsZero {
372+ return "(" + v + ").IsDefined() || !(" + v + ").IsZero()"
373+ } else if implementsIsDefined {
374+ return "(" + v + ").IsDefined()"
375+ } else if implementsIsZero {
376+ return "!(" + v + ").IsZero()"
377+ }
378+
379+ switch t .Kind () {
380+ case reflect .Slice , reflect .Map :
381+ return v + " != nil && len(" + v + ") != 0"
382+ case reflect .Interface , reflect .Ptr :
383+ return v + " != nil"
384+ case reflect .Bool :
385+ return v
386+ case reflect .String :
387+ return v + ` != ""`
388+ case reflect .Float32 , reflect .Float64 ,
389+ reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 ,
390+ reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 ,
391+ reflect .Uintptr :
392+
393+ return v + " != 0"
394+ case reflect .Array :
395+ // NOTE: stdlib encoding/json does not check if array elements implement IsZero, so we don't either
396+ return "(" + v + " != " + g .getType (t ) + "{})"
397+ case reflect .Struct :
398+ // NOTE: stdlib encoding/json does not check if struct fields implement IsZero, so we don't either
399+ return "(" + v + " != " + g .getType (t ) + "{})"
400+
401+ default :
402+ return "true"
403+ }
404+ }
405+
365406func (g * Generator ) genStructFieldEncoder (t reflect.Type , f reflect.StructField , first , firstCondition bool ) (bool , error ) {
366407 jsonName := g .fieldNamer .GetJSONFieldName (t , f )
367408 tags := parseFieldTags (f )
@@ -384,7 +425,7 @@ func (g *Generator) genStructFieldEncoder(t reflect.Type, f reflect.StructField,
384425 fmt .Fprintln (g .out , " if" , g .notZeroCheck (f .Type , "in." + f .Name ), "{" )
385426 // can be any in runtime, so toggleFirstCondition stay as is
386427 } else {
387- fmt .Fprintln (g .out , " if" , g .notEmptyCheck ( f . Type , "in." + f . Name ), "&&" , g . notZeroCheck (f .Type , "in." + f .Name ), "{" )
428+ fmt .Fprintln (g .out , " if" , g .notEmptyOrZeroCheck (f .Type , "in." + f .Name ), "{" )
388429 // can be any in runtime, so toggleFirstCondition stay as is
389430 }
390431
0 commit comments