Skip to content

Commit e9fa7f5

Browse files
mromaszewiczclaude
andcommitted
feat: add RequiredParameterError typed error for missing required query params
Export RequiredParameterError so generated server code can use errors.As to detect missing required parameters and produce framework-specific typed errors for application error handlers. Previously these were plain fmt.Errorf strings that couldn't be distinguished from format errors without string matching. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 629ff6e commit e9fa7f5

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

bindparam.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@ import (
2626
"github.com/oapi-codegen/runtime/types"
2727
)
2828

29+
// RequiredParameterError is returned when a required query parameter is missing.
30+
// Generated server code can use errors.As to detect this and produce a
31+
// framework-specific typed error for the application's error handler.
32+
type RequiredParameterError struct {
33+
ParamName string
34+
}
35+
36+
func (e *RequiredParameterError) Error() string {
37+
return fmt.Sprintf("query parameter '%s' is required", e.ParamName)
38+
}
39+
2940
// BindStyledParameter binds a parameter as described in the Path Parameters
3041
// section here to a Go object:
3142
// https://swagger.io/docs/specification/serialization/
@@ -438,7 +449,7 @@ func BindQueryParameterWithOptions(style string, explode bool, required bool, pa
438449

439450
if !found {
440451
if required {
441-
return fmt.Errorf("query parameter '%s' is required", paramName)
452+
return &RequiredParameterError{ParamName: paramName}
442453
} else {
443454
// If an optional parameter is not found, we do nothing,
444455
return nil
@@ -473,7 +484,7 @@ func BindQueryParameterWithOptions(style string, explode bool, required bool, pa
473484
// unmarshal.
474485
if len(values) == 0 {
475486
if required {
476-
return fmt.Errorf("query parameter '%s' is required", paramName)
487+
return &RequiredParameterError{ParamName: paramName}
477488
} else {
478489
return nil
479490
}
@@ -484,7 +495,7 @@ func BindQueryParameterWithOptions(style string, explode bool, required bool, pa
484495

485496
if !found {
486497
if required {
487-
return fmt.Errorf("query parameter '%s' is required", paramName)
498+
return &RequiredParameterError{ParamName: paramName}
488499
} else {
489500
// If an optional parameter is not found, we do nothing,
490501
return nil
@@ -506,7 +517,7 @@ func BindQueryParameterWithOptions(style string, explode bool, required bool, pa
506517
values, found := queryParams[paramName]
507518
if !found {
508519
if required {
509-
return fmt.Errorf("query parameter '%s' is required", paramName)
520+
return &RequiredParameterError{ParamName: paramName}
510521
} else {
511522
return nil
512523
}
@@ -560,7 +571,7 @@ func BindQueryParameterWithOptions(style string, explode bool, required bool, pa
560571
default:
561572
if len(parts) == 0 {
562573
if required {
563-
return fmt.Errorf("query parameter '%s' is required", paramName)
574+
return &RequiredParameterError{ParamName: paramName}
564575
} else {
565576
return nil
566577
}
@@ -682,7 +693,7 @@ func BindRawQueryParameter(style string, explode bool, required bool, paramName
682693
case reflect.Slice:
683694
if !found {
684695
if required {
685-
return fmt.Errorf("query parameter '%s' is required", paramName)
696+
return &RequiredParameterError{ParamName: paramName}
686697
}
687698
return nil
688699
}
@@ -696,7 +707,7 @@ func BindRawQueryParameter(style string, explode bool, required bool, paramName
696707
default:
697708
if len(values) == 0 {
698709
if required {
699-
return fmt.Errorf("query parameter '%s' is required", paramName)
710+
return &RequiredParameterError{ParamName: paramName}
700711
}
701712
return nil
702713
}
@@ -705,7 +716,7 @@ func BindRawQueryParameter(style string, explode bool, required bool, paramName
705716
}
706717
if !found {
707718
if required {
708-
return fmt.Errorf("query parameter '%s' is required", paramName)
719+
return &RequiredParameterError{ParamName: paramName}
709720
}
710721
return nil
711722
}
@@ -726,7 +737,7 @@ func BindRawQueryParameter(style string, explode bool, required bool, paramName
726737
rawValues, found := findRawQueryParam(rawQuery, paramName)
727738
if !found {
728739
if required {
729-
return fmt.Errorf("query parameter '%s' is required", paramName)
740+
return &RequiredParameterError{ParamName: paramName}
730741
}
731742
return nil
732743
}
@@ -765,7 +776,7 @@ func BindRawQueryParameter(style string, explode bool, required bool, paramName
765776
default:
766777
if len(parts) == 0 {
767778
if required {
768-
return fmt.Errorf("query parameter '%s' is required", paramName)
779+
return &RequiredParameterError{ParamName: paramName}
769780
}
770781
return nil
771782
}

0 commit comments

Comments
 (0)