Documentation ¶
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var DefaultProblemMatchers = []ProblemMatcher{ NewStatusProblemMatcher(http.StatusNotFound, errors.IsNotFoundError), NewValidationWithViolationsProblemMatcher(), NewStatusProblemMatcher(http.StatusUnprocessableEntity, errors.IsValidationError), NewStatusProblemMatcher(http.StatusBadRequest, errors.IsBadRequestError), NewStatusProblemMatcher(http.StatusConflict, errors.IsConflictError), }
DefaultProblemMatchers is a list of default ProblemMatchers. nolint: gochecknoglobals
Functions ¶
This section is empty.
Types ¶
type ErrorMatcher ¶
ErrorMatcher checks if an error matches a certain condition.
type ProblemConverter ¶
type ProblemConverter interface { // NewProblem creates a new RFC-7807 Problem from an error. // A problem can be any structure that marshals to an RFC-7807 compatible JSON/XML structure. NewProblem(ctx context.Context, err error) interface{} }
ProblemConverter converts an error to a RFC-7807 Problem.
See details at https://tools.ietf.org/html/rfc7807
func NewDefaultProblemConverter ¶ added in v0.2.0
func NewDefaultProblemConverter(opts ...ProblemConverterOption) ProblemConverter
NewProblemConverter returns a new ProblemConverter implementation populated with default problem matchers.
func NewProblemConverter ¶
func NewProblemConverter(opts ...ProblemConverterOption) ProblemConverter
NewProblemConverter returns a new ProblemConverter implementation.
Example ¶
problemConverter := NewProblemConverter( WithProblemMatchers( NewStatusProblemMatcher(http.StatusNotFound, func(err error) bool { return err.Error() == "not found" }), ), ) err := errors.New("not found") problem := problemConverter.NewProblem(context.Background(), err).(*problems.DefaultProblem) fmt.Println(problem.Status, problem.Detail)
Output: 404 not found
type ProblemConverterOption ¶
type ProblemConverterOption interface {
// contains filtered or unexported methods
}
ProblemConverterOption configures a ProblemConverter using the functional options paradigm popularized by Rob Pike and Dave Cheney. If you're unfamiliar with this style, see: - https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html - https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis.
func WithProblemConverter ¶
func WithProblemConverter(converter ProblemConverter) ProblemConverterOption
WithProblemConverter configures a ProblemConverter.
func WithProblemMatchers ¶
func WithProblemMatchers(matchers ...ProblemMatcher) ProblemConverterOption
WithProblemMatchers configures a ProblemConverter to match errors. By default an empty problem is created. If no matchers match an error (or no matchers are configured) an HTTP 500 problem is returned.
If a matcher also implements ProblemConverter it is used instead of the builtin ProblemConverter for creating the problem.
If a matcher also implements StatusProblemMatcher the builtin StatusProblemConverter is used for creating the problem.
func WithStatusProblemConverter ¶
func WithStatusProblemConverter(converter StatusProblemConverter) ProblemConverterOption
WithStatusProblemConverter configures a StatusProblemConverter.
type ProblemMatcher ¶
type ProblemMatcher interface { // MatchError evaluates the predefined set of conditions for err. MatchError(err error) bool }
ProblemMatcher matches an error. A ProblemMatcher usually also implements one of the following interfaces:
- StatusProblemMatcher to indicate an HTTP status code for an error - ProblemConverter if a matched error requires special conversion logic
func NewValidationWithViolationsProblemMatcher ¶
func NewValidationWithViolationsProblemMatcher() ProblemMatcher
NewValidationWithViolationsProblemMatcher returns a problem matcher for validation errors that contain violations. If the returned error matches the following interface, a special validation problem is returned by NewProblem:
type violationError interface { Violations() map[string][]string }
type StatusProblem ¶
type StatusProblem interface {
ProblemStatus() int
}
StatusProblem is the interface describing a problem with an associated Status code.
type StatusProblemConverter ¶
type StatusProblemConverter interface { // NewStatusProblem creates a new RFC-7807 Problem with a status code. NewStatusProblem(ctx context.Context, status int, err error) StatusProblem }
StatusProblemConverter converts an error to a RFC-7807 Problem.
See details at https://tools.ietf.org/html/rfc7807
type StatusProblemMatcher ¶
type StatusProblemMatcher interface { ProblemMatcher // Status returns the HTTP status code. Status() int }
StatusProblemMatcher matches an error and returns the appropriate status code for it.
func NewStatusProblemMatcher ¶
func NewStatusProblemMatcher(status int, errorMatcher ErrorMatcher) StatusProblemMatcher
NewStatusProblemMatcher returns a new StatusProblemMatcher.
type ValidationProblem ¶
type ValidationProblem struct { *problems.DefaultProblem Violations map[string][]string `json:"violations"` }
ValidationProblem describes an RFC-7807 problem with validation violations.
func NewValidationProblem ¶
func NewValidationProblem(details string, violations map[string][]string) *ValidationProblem
NewValidationProblem returns a problem with details and validation errors.