Skip to content

Commit 15682e3

Browse files
tzq0301ofekshenawa
andauthored
feat: support write the types of pointer of simple data types (#2745) (#2753)
Co-authored-by: ofekshenawa <[email protected]>
1 parent 81947da commit 15682e3

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed

internal/proto/writer.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,37 +65,68 @@ func (w *Writer) WriteArg(v interface{}) error {
6565
return w.string("")
6666
case string:
6767
return w.string(v)
68+
case *string:
69+
return w.string(*v)
6870
case []byte:
6971
return w.bytes(v)
7072
case int:
7173
return w.int(int64(v))
74+
case *int:
75+
return w.int(int64(*v))
7276
case int8:
7377
return w.int(int64(v))
78+
case *int8:
79+
return w.int(int64(*v))
7480
case int16:
7581
return w.int(int64(v))
82+
case *int16:
83+
return w.int(int64(*v))
7684
case int32:
7785
return w.int(int64(v))
86+
case *int32:
87+
return w.int(int64(*v))
7888
case int64:
7989
return w.int(v)
90+
case *int64:
91+
return w.int(*v)
8092
case uint:
8193
return w.uint(uint64(v))
94+
case *uint:
95+
return w.uint(uint64(*v))
8296
case uint8:
8397
return w.uint(uint64(v))
98+
case *uint8:
99+
return w.uint(uint64(*v))
84100
case uint16:
85101
return w.uint(uint64(v))
102+
case *uint16:
103+
return w.uint(uint64(*v))
86104
case uint32:
87105
return w.uint(uint64(v))
106+
case *uint32:
107+
return w.uint(uint64(*v))
88108
case uint64:
89109
return w.uint(v)
110+
case *uint64:
111+
return w.uint(*v)
90112
case float32:
91113
return w.float(float64(v))
114+
case *float32:
115+
return w.float(float64(*v))
92116
case float64:
93117
return w.float(v)
118+
case *float64:
119+
return w.float(*v)
94120
case bool:
95121
if v {
96122
return w.int(1)
97123
}
98124
return w.int(0)
125+
case *bool:
126+
if *v {
127+
return w.int(1)
128+
}
129+
return w.int(0)
99130
case time.Time:
100131
w.numBuf = v.AppendFormat(w.numBuf[:0], time.RFC3339Nano)
101132
return w.bytes(w.numBuf)

internal/proto/writer_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
. "github.com/bsm/gomega"
1313

1414
"github.com/redis/go-redis/v9/internal/proto"
15+
"github.com/redis/go-redis/v9/internal/util"
1516
)
1617

1718
type MyType struct{}
@@ -100,3 +101,53 @@ func BenchmarkWriteBuffer_Append(b *testing.B) {
100101
}
101102
}
102103
}
104+
105+
var _ = Describe("WriteArg", func() {
106+
var buf *bytes.Buffer
107+
var wr *proto.Writer
108+
109+
BeforeEach(func() {
110+
buf = new(bytes.Buffer)
111+
wr = proto.NewWriter(buf)
112+
})
113+
114+
args := map[any]string{
115+
"hello": "$1\r\nhello\r\n",
116+
int(10): "$2\r\n10\r\n",
117+
util.ToPtr(int(10)): "$2\r\n10\r\n",
118+
int8(10): "$2\r\n10\r\n",
119+
util.ToPtr(int8(10)): "$2\r\n10\r\n",
120+
int16(10): "$2\r\n10\r\n",
121+
util.ToPtr(int16(10)): "$2\r\n10\r\n",
122+
int32(10): "$2\r\n10\r\n",
123+
util.ToPtr(int32(10)): "$2\r\n10\r\n",
124+
int64(10): "$2\r\n10\r\n",
125+
util.ToPtr(int64(10)): "$2\r\n10\r\n",
126+
uint(10): "$2\r\n10\r\n",
127+
util.ToPtr(uint(10)): "$2\r\n10\r\n",
128+
uint8(10): "$2\r\n10\r\n",
129+
util.ToPtr(uint8(10)): "$2\r\n10\r\n",
130+
uint16(10): "$2\r\n10\r\n",
131+
util.ToPtr(uint16(10)): "$2\r\n10\r\n",
132+
uint32(10): "$2\r\n10\r\n",
133+
util.ToPtr(uint32(10)): "$2\r\n10\r\n",
134+
uint64(10): "$2\r\n10\r\n",
135+
util.ToPtr(uint64(10)): "$2\r\n10\r\n",
136+
float32(10.3): "$4\r\n10.3\r\n",
137+
util.ToPtr(float32(10.3)): "$4\r\n10.3\r\n",
138+
float64(10.3): "$4\r\n10.3\r\n",
139+
util.ToPtr(float64(10.3)): "$4\r\n10.3\r\n",
140+
bool(true): "$1\r\n1\r\n",
141+
bool(false): "$1\r\n0\r\n",
142+
util.ToPtr(bool(true)): "$1\r\n1\r\n",
143+
util.ToPtr(bool(false)): "$1\r\n0\r\n",
144+
}
145+
146+
for arg, expect := range args {
147+
It(fmt.Sprintf("should write arg of type %T", arg), func() {
148+
err := wr.WriteArg(arg)
149+
Expect(err).NotTo(HaveOccurred())
150+
Expect(buf.String()).To(Equal(expect))
151+
})
152+
}
153+
})

internal/util/type.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package util
2+
3+
func ToPtr[T any](v T) *T {
4+
return &v
5+
}

0 commit comments

Comments
 (0)