ParseCustomList is a function that handles csv query params or multiple values for a query param. Csv is supported as it is a common way to pass multiple values in a query param. Multiple values is supported (key=value&key=value2) for feature parity with GitHub issue search.
(parser *QueryParamParser, vals url.Values, def []T, queryParam string, parseFunc func(v string) (T, error))
| 368 | // Csv is supported as it is a common way to pass multiple values in a query param. |
| 369 | // Multiple values is supported (key=value&key=value2) for feature parity with GitHub issue search. |
| 370 | func ParseCustomList[T any](parser *QueryParamParser, vals url.Values, def []T, queryParam string, parseFunc func(v string) (T, error)) []T { |
| 371 | v, err := parseQueryParamSet(parser, vals, func(set []string) ([]T, error) { |
| 372 | // Gather all terms. |
| 373 | allTerms := make([]string, 0, len(set)) |
| 374 | for _, s := range set { |
| 375 | // If a term is a csv, break it out into individual terms. |
| 376 | terms := strings.Split(s, ",") |
| 377 | allTerms = append(allTerms, terms...) |
| 378 | } |
| 379 | |
| 380 | var badErrors error |
| 381 | var output []T |
| 382 | for _, s := range allTerms { |
| 383 | good, err := parseFunc(s) |
| 384 | if err != nil { |
| 385 | badErrors = errors.Join(badErrors, err) |
| 386 | continue |
| 387 | } |
| 388 | output = append(output, good) |
| 389 | } |
| 390 | if badErrors != nil { |
| 391 | return []T{}, badErrors |
| 392 | } |
| 393 | |
| 394 | return output, nil |
| 395 | }, def, queryParam) |
| 396 | if err != nil { |
| 397 | parser.Errors = append(parser.Errors, codersdk.ValidationError{ |
| 398 | Field: queryParam, |
| 399 | Detail: fmt.Sprintf("Query param %q has invalid values: %s", queryParam, err.Error()), |
| 400 | }) |
| 401 | } |
| 402 | return v |
| 403 | } |
| 404 | |
| 405 | func parseNullableQueryParam[T any](parser *QueryParamParser, vals url.Values, parse func(v string) (T, error), def sql.Null[T], queryParam string) (sql.Null[T], error) { |
| 406 | setParse := parseSingle(parser, parse, def.V, queryParam) |