@@ -248,13 +248,23 @@ func ParseCustom[T any](parser *QueryParamParser, vals url.Values, def T, queryP
248
248
return v
249
249
}
250
250
251
- // ParseCustomList is a function that handles csv query params.
251
+ // ParseCustomList is a function that handles csv query params or multiple values
252
+ // for a query param.
253
+ // Csv is supported as it is a common way to pass multiple values in a query param.
254
+ // Multiple values is supported (key=value&key=value2) for feature parity with GitHub issue search.
252
255
func ParseCustomList [T any ](parser * QueryParamParser , vals url.Values , def []T , queryParam string , parseFunc func (v string ) (T , error )) []T {
253
- v , err := parseQueryParam (parser , vals , func (v string ) ([]T , error ) {
254
- terms := strings .Split (v , "," )
256
+ v , err := parseQueryParamSet (parser , vals , func (set []string ) ([]T , error ) {
257
+ // Gather all terms.
258
+ allTerms := make ([]string , 0 , len (set ))
259
+ for _ , s := range set {
260
+ // If a term is a csv, break it out into individual terms.
261
+ terms := strings .Split (s , "," )
262
+ allTerms = append (allTerms , terms ... )
263
+ }
264
+
255
265
var badValues []string
256
266
var output []T
257
- for _ , s := range terms {
267
+ for _ , s := range allTerms {
258
268
good , err := parseFunc (s )
259
269
if err != nil {
260
270
badValues = append (badValues , s )
@@ -277,7 +287,18 @@ func ParseCustomList[T any](parser *QueryParamParser, vals url.Values, def []T,
277
287
return v
278
288
}
279
289
290
+ // parseQueryParam expects just 1 value set for the given query param.
280
291
func parseQueryParam [T any ](parser * QueryParamParser , vals url.Values , parse func (v string ) (T , error ), def T , queryParam string ) (T , error ) {
292
+ setParse := func (set []string ) (T , error ) {
293
+ if len (set ) > 1 {
294
+ return def , xerrors .Errorf ("multiple values provided for the query param %q, only 1 is supported" , queryParam )
295
+ }
296
+ return parse (set [0 ])
297
+ }
298
+ return parseQueryParamSet (parser , vals , setParse , def , queryParam )
299
+ }
300
+
301
+ func parseQueryParamSet [T any ](parser * QueryParamParser , vals url.Values , parse func (set []string ) (T , error ), def T , queryParam string ) (T , error ) {
281
302
parser .addParsed (queryParam )
282
303
// If the query param is required and not present, return an error.
283
304
if parser .RequiredNotEmptyParams [queryParam ] && (! vals .Has (queryParam ) || vals .Get (queryParam ) == "" ) {
@@ -293,6 +314,5 @@ func parseQueryParam[T any](parser *QueryParamParser, vals url.Values, parse fun
293
314
return def , nil
294
315
}
295
316
296
- str := vals .Get (queryParam )
297
- return parse (str )
317
+ return parse (vals [queryParam ])
298
318
}
0 commit comments