@@ -37,7 +37,9 @@ func (b *Builder) write(sb *strings.Builder, resArgs *[]any, s string, args ...a
37
37
38
38
arg := args [argID ]
39
39
s = s [1 :]
40
- b .writeArg (sb , resArgs , verb , arg )
40
+ if err := b .writeArg (sb , resArgs , verb , arg ); err != nil {
41
+ return err
42
+ }
41
43
42
44
case '+' , '#' :
43
45
isBatch := verb == '#'
@@ -56,9 +58,13 @@ func (b *Builder) write(sb *strings.Builder, resArgs *[]any, s string, args ...a
56
58
s = s [1 :]
57
59
58
60
if isBatch {
59
- b .writeBatch (sb , resArgs , verb , arg )
61
+ if err := b .writeBatch (sb , resArgs , verb , arg ); err != nil {
62
+ return err
63
+ }
60
64
} else {
61
- b .writeSlice (sb , resArgs , verb , arg )
65
+ if err := b .writeSlice (sb , resArgs , verb , arg ); err != nil {
66
+ return err
67
+ }
62
68
}
63
69
64
70
default :
@@ -79,30 +85,44 @@ func (b *Builder) write(sb *strings.Builder, resArgs *[]any, s string, args ...a
79
85
}
80
86
}
81
87
82
- func (b * Builder ) writeBatch (sb * strings.Builder , resArgs * []any , verb byte , arg any ) {
83
- for i , arg := range b .asSlice (arg ) {
88
+ func (b * Builder ) writeBatch (sb * strings.Builder , resArgs * []any , verb byte , arg any ) error {
89
+ args , err := b .asSlice (arg )
90
+ if err != nil {
91
+ return err
92
+ }
93
+ for i , arg := range args {
84
94
if i > 0 {
85
95
sb .WriteString (", " )
86
96
}
87
97
sb .WriteByte ('(' )
88
- b .writeSlice (sb , resArgs , verb , arg )
98
+ if err := b .writeSlice (sb , resArgs , verb , arg ); err != nil {
99
+ return err
100
+ }
89
101
sb .WriteByte (')' )
90
102
}
103
+ return nil
91
104
}
92
105
93
- func (b * Builder ) writeSlice (sb * strings.Builder , resArgs * []any , verb byte , arg any ) {
94
- for i , arg := range b .asSlice (arg ) {
106
+ func (b * Builder ) writeSlice (sb * strings.Builder , resArgs * []any , verb byte , arg any ) error {
107
+ args , err := b .asSlice (arg )
108
+ if err != nil {
109
+ return err
110
+ }
111
+ for i , arg := range args {
95
112
if i > 0 {
96
113
sb .WriteString (", " )
97
114
}
98
- b .writeArg (sb , resArgs , verb , arg )
115
+ if err := b .writeArg (sb , resArgs , verb , arg ); err != nil {
116
+ return err
117
+ }
99
118
}
119
+ return nil
100
120
}
101
121
102
- func (b * Builder ) writeArg (sb * strings.Builder , resArgs * []any , verb byte , arg any ) {
122
+ func (b * Builder ) writeArg (sb * strings.Builder , resArgs * []any , verb byte , arg any ) error {
103
123
if b .debug {
104
124
b .writeDebug (sb , arg )
105
- return
125
+ return nil
106
126
}
107
127
108
128
var isSimple bool
@@ -128,21 +148,25 @@ func (b *Builder) writeArg(sb *strings.Builder, resArgs *[]any, verb byte, arg a
128
148
}
129
149
case 'd' :
130
150
isSimple = true
131
- b .assertNumber (arg )
151
+ if err := b .assertNumber (arg ); err != nil {
152
+ return err
153
+ }
132
154
fmt .Fprint (sb , arg )
133
155
}
134
156
135
157
// ok to have many simple placeholders
136
158
if isSimple {
137
- return
159
+ return nil
138
160
}
139
161
140
162
switch {
141
163
case b .placeholder == 0 :
142
164
b .placeholder = verb
143
165
case b .placeholder != verb :
144
- b . setErr ( errMixedPlaceholders )
166
+ return errMixedPlaceholders
145
167
}
168
+
169
+ return nil
146
170
}
147
171
148
172
func (b * Builder ) writeDebug (sb * strings.Builder , arg any ) {
@@ -172,33 +196,27 @@ func (b *Builder) writeDebug(sb *strings.Builder, arg any) {
172
196
}
173
197
}
174
198
175
- func (b * Builder ) asSlice (v any ) []any {
199
+ func (b * Builder ) asSlice (v any ) ( []any , error ) {
176
200
value := reflect .ValueOf (v )
177
201
178
202
if value .Kind () != reflect .Slice {
179
- b .setErr (errNonSliceArgument )
180
- return nil
203
+ return nil , errNonSliceArgument
181
204
}
182
205
183
206
res := make ([]any , value .Len ())
184
207
for i := 0 ; i < value .Len (); i ++ {
185
208
res [i ] = value .Index (i ).Interface ()
186
209
}
187
- return res
210
+ return res , nil
188
211
}
189
212
190
- func (b * Builder ) assertNumber (v any ) {
213
+ func (b * Builder ) assertNumber (v any ) error {
191
214
switch v .(type ) {
192
215
case int , int8 , int16 , int32 , int64 ,
193
216
uint , uint8 , uint16 , uint32 , uint64 ,
194
217
float32 , float64 :
218
+ return nil
195
219
default :
196
- b .setErr (errNonNumericArg )
197
- }
198
- }
199
-
200
- func (b * Builder ) setErr (err error ) {
201
- if b .err == nil {
202
- b .err = err
220
+ return errNonNumericArg
203
221
}
204
222
}
0 commit comments