Skip to content

Commit

Permalink
Added handling for non-zero values excluding false (#35)
Browse files Browse the repository at this point in the history
* Added handling for non-zero values excluding `false`

* Resolving comments.
  • Loading branch information
AbanobNageh authored Jan 27, 2025
1 parent 05fa0cd commit 2490e7b
Show file tree
Hide file tree
Showing 2 changed files with 158 additions and 1 deletion.
17 changes: 16 additions & 1 deletion zap/zap.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package zap

import (
"reflect"

"github.com/pkg/errors"
"go.uber.org/zap"
)
Expand All @@ -18,6 +20,19 @@ func Init() (*Logger, error) {
return &Logger{sugarLog}, nil
}

func appendFilledFieldsOnly[T any](fields *[]any, key string, value T) {
func appendFilledFieldsOnly(fields *[]any, key string, value any) {
if value == nil {
return
}

reflectedValue := reflect.ValueOf(value)
if reflectedValue.Kind() != reflect.Bool && reflectedValue.IsZero() {
return
}

if (reflectedValue.Kind() == reflect.Slice || reflectedValue.Kind() == reflect.Map) && reflectedValue.Len() == 0 {
return
}

*fields = append(*fields, key, value)
}
142 changes: 142 additions & 0 deletions zap/zap_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
package zap

import (
"testing"

"github.com/stretchr/testify/assert"
)

type testStruct struct {
Field string
}

func Test_appendFilledFieldsOnly(t *testing.T) {
tests := []struct {
name string
fields []any
value any
want []any
}{
{
name: "nil value",
fields: []any{},
value: nil,
want: []any{},
},
{
name: "nil pointer",
fields: []any{},
value: (*string)(nil),
want: []any{},
},
{
name: "empty string value",
fields: []any{},
value: "",
want: []any{},
},
{
name: "string with spaces",
fields: []any{},
value: " ",
want: []any{"key", " "},
},
{
name: "string with special characters",
fields: []any{},
value: "!@#$%",
want: []any{"key", "!@#$%"},
},
{
name: "zero int value",
fields: []any{},
value: 0,
want: []any{},
},
{
name: "zero float value",
fields: []any{},
value: 0.0,
want: []any{},
},
{
name: "negative number",
fields: []any{},
value: -1,
want: []any{"key", -1},
},
{
name: "positive float value",
fields: []any{},
value: 3.14,
want: []any{"key", 3.14},
},
{
name: "boolean false value",
fields: []any{},
value: false,
want: []any{"key", false},
},
{
name: "boolean true value",
fields: []any{},
value: true,
want: []any{"key", true},
},
{
name: "empty struct",
fields: []any{},
value: testStruct{},
want: []any{},
},
{
name: "non-empty struct",
fields: []any{},
value: testStruct{Field: "value"},
want: []any{"key", testStruct{Field: "value"}},
},
{
name: "empty slice",
fields: []any{},
value: []string{},
want: []any{},
},
{
name: "non-empty slice",
fields: []any{},
value: []string{"item"},
want: []any{"key", []string{"item"}},
},
{
name: "empty map",
fields: []any{},
value: map[string]string{},
want: []any{},
},
{
name: "non-empty map",
fields: []any{},
value: map[string]string{"key": "value"},
want: []any{"key", map[string]string{"key": "value"}},
},
{
name: "existing fields",
fields: []any{"existing", 1},
value: "value",
want: []any{"existing", 1, "key", "value"},
},
{
name: "boolean true with existing fields",
fields: []any{"existing", 1},
value: true,
want: []any{"existing", 1, "key", true},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
appendFilledFieldsOnly(&tt.fields, "key", tt.value)
assert.Equal(t, tt.want, tt.fields)
})
}
}

0 comments on commit 2490e7b

Please sign in to comment.