Skip to content

Commit 4bd5d41

Browse files
gh73962Guo Huindyakov
authored
feat: func isEmptyValue support time.Time (#3273)
* fix:func isEmptyValue support time.Time * fix: Improve HSet unit tests * feat: Improve HSet unit tests * fix: isEmptyValue Struct only support time.Time * test(hset): add empty custom struct test --------- Co-authored-by: Guo Hui <[email protected]> Co-authored-by: Nedyalko Dyakov <[email protected]>
1 parent 182a04f commit 4bd5d41

File tree

2 files changed

+71
-4
lines changed

2 files changed

+71
-4
lines changed

commands.go

+6
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,12 @@ func isEmptyValue(v reflect.Value) bool {
155155
return v.Float() == 0
156156
case reflect.Interface, reflect.Pointer:
157157
return v.IsNil()
158+
case reflect.Struct:
159+
if v.Type() == reflect.TypeOf(time.Time{}) {
160+
return v.IsZero()
161+
}
162+
// Only supports the struct time.Time,
163+
// subsequent iterations will follow the func Scan support decoder.
158164
}
159165
return false
160166
}

commands_test.go

+65-4
Original file line numberDiff line numberDiff line change
@@ -2578,6 +2578,63 @@ var _ = Describe("Commands", func() {
25782578
"val2",
25792579
"val",
25802580
}))
2581+
2582+
type setOmitEmpty struct {
2583+
Set1 string `redis:"set1"`
2584+
Set2 int `redis:"set2,omitempty"`
2585+
Set3 time.Duration `redis:"set3,omitempty"`
2586+
Set4 string `redis:"set4,omitempty"`
2587+
Set5 time.Time `redis:"set5,omitempty"`
2588+
Set6 *numberStruct `redis:"set6,omitempty"`
2589+
Set7 numberStruct `redis:"set7,omitempty"`
2590+
}
2591+
2592+
hSet = client.HSet(ctx, "hash3", &setOmitEmpty{
2593+
Set1: "val",
2594+
})
2595+
Expect(hSet.Err()).NotTo(HaveOccurred())
2596+
// both set1 and set7 are set
2597+
// custom struct is not omitted
2598+
Expect(hSet.Val()).To(Equal(int64(2)))
2599+
2600+
hGetAll := client.HGetAll(ctx, "hash3")
2601+
Expect(hGetAll.Err()).NotTo(HaveOccurred())
2602+
Expect(hGetAll.Val()).To(Equal(map[string]string{
2603+
"set1": "val",
2604+
"set7": `{"Number":0}`,
2605+
}))
2606+
var hash3 setOmitEmpty
2607+
Expect(hGetAll.Scan(&hash3)).NotTo(HaveOccurred())
2608+
Expect(hash3.Set1).To(Equal("val"))
2609+
Expect(hash3.Set2).To(Equal(0))
2610+
Expect(hash3.Set3).To(Equal(time.Duration(0)))
2611+
Expect(hash3.Set4).To(Equal(""))
2612+
Expect(hash3.Set5).To(Equal(time.Time{}))
2613+
Expect(hash3.Set6).To(BeNil())
2614+
Expect(hash3.Set7).To(Equal(numberStruct{}))
2615+
2616+
now := time.Now()
2617+
hSet = client.HSet(ctx, "hash4", setOmitEmpty{
2618+
Set1: "val",
2619+
Set5: now,
2620+
Set6: &numberStruct{
2621+
Number: 5,
2622+
},
2623+
Set7: numberStruct{
2624+
Number: 3,
2625+
},
2626+
})
2627+
Expect(hSet.Err()).NotTo(HaveOccurred())
2628+
Expect(hSet.Val()).To(Equal(int64(4)))
2629+
2630+
hGetAll = client.HGetAll(ctx, "hash4")
2631+
Expect(hGetAll.Err()).NotTo(HaveOccurred())
2632+
Expect(hGetAll.Val()).To(Equal(map[string]string{
2633+
"set1": "val",
2634+
"set5": now.Format(time.RFC3339Nano),
2635+
"set6": `{"Number":5}`,
2636+
"set7": `{"Number":3}`,
2637+
}))
25812638
})
25822639

25832640
It("should HSetNX", func() {
@@ -7619,12 +7676,16 @@ type numberStruct struct {
76197676
Number int
76207677
}
76217678

7622-
func (s *numberStruct) MarshalBinary() ([]byte, error) {
7623-
return json.Marshal(s)
7679+
func (n numberStruct) MarshalBinary() ([]byte, error) {
7680+
return json.Marshal(n)
7681+
}
7682+
7683+
func (n *numberStruct) UnmarshalBinary(b []byte) error {
7684+
return json.Unmarshal(b, n)
76247685
}
76257686

7626-
func (s *numberStruct) UnmarshalBinary(b []byte) error {
7627-
return json.Unmarshal(b, s)
7687+
func (n *numberStruct) ScanRedis(str string) error {
7688+
return json.Unmarshal([]byte(str), n)
76287689
}
76297690

76307691
func deref(viface interface{}) interface{} {

0 commit comments

Comments
 (0)