Documentation
¶
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type DTO ¶
type DTO struct {
// Type is a URI reference that identifies the problem type.
// Ideally, the URI should resolve to human-readable information describing the type, but that’s not necessary.
// The problem type provides more specific information than the HTTP status code itself.
//
// Type URI reference [RFC3986] identifies the problem type.
// This specification encourages that, when dereferenced,
// it provides human-readable documentation for the problem type (e.g., using HTML [W3C.REC-html5-20141028]).
// When this member is absent, its value is assumed to be "about:blank".
//
// Consumers MUST use the "type" string as the primary identifier for
// the problem type; the "title" string is advisory and included only
// for users who are not aware of the semantics of the URI and do not
// have the ability to discover them (e.g., offline log analysis).
// Consumers SHOULD NOT automatically dereference the type URI.
//
// Example: "/errors/incorrect-user-pass"
Type Type
// Title is a human-readable description of the problem type,
// meaning that it should always be the same for the same type.
//
// Example: "Incorrect username or password."
Title string
// Status The status reflectkit the HTTP status code and is a convenient way to make problem details self-contained.
// That way, error replies can interpret outside the context of the HTTP interaction.
// Status is an optional field.
//
// Example: 401
Status int
// Detail is a human-readable description of the problem instance,
// explaining why the problem occurred in this specific case.
//
// Example: "Authentication failed due to incorrect username or password."
Detail string
// Instance is a URI that identifies the specific occurrence of the error
// Instance is optional
//
// Example: "/login/log/abc123"
Instance string
// Extensions is a user-defined optional generic type that holds additional details in your error reply.
// For example, suppose your company already has its error reply convention.
// In that case, you can use the extension as a backward compatibility layer
// to roll out the Handler standard in your project
// without breaking any API contract between your server and its clients.
//
// Example: {...,"error":{"code":"foo-bar-baz","message":"foo bar baz"}}
Extensions any
}
DTO error data transfer object is made in an effort to standardize REST API error handling, the IETF devised RFC 7807, which creates a generalized error-handling schema. https://www.rfc-editor.org/rfc/rfc7807
Example:
{
"type": "/errors/incorrect-user-pass",
"title": "Incorrect username or password.",
"status": 401,
"detail": "Authentication failed due to incorrect username or password.",
"instance": "/login/log/abc123"
}
func (DTO) MarshalJSON ¶
func (*DTO) UnmarshalJSON ¶
type DTOExt ¶
type DTOExt[Extensions any] struct { Type Type Title string Status int Detail string Instance string // Extensions is a user-defined optional generic structure type that holds additional details in your error reply. // For example, suppose your company already has its error reply convention. // In that case, you can use the extension as a backward compatibility layer // to roll out the Handler standard in your project // without breaking any API contract between your server and its clients. // // Example: {...,"error":{"code":"foo-bar-baz","message":"foo bar baz"}} Extensions Extensions }
DTOExt is a DTO type variant that can be used for receiving error messages in a type safe way
func (DTOExt[Extensions]) MarshalJSON ¶
func (*DTOExt[Extensions]) UnmarshalJSON ¶
type Handler ¶
type Handler struct {
// Mapping supplies the mapping logic that map the error value to a DTO[Extensions].
Mapping HandlerMappingFunc
// BaseURL is the URI path prefix the error types should have.
// If none given, default is "/".
BaseURL string
}
func (Handler) HandleError ¶
Example ¶
package main
import (
"context"
"errors"
"net/http"
"go.llib.dev/frameless/pkg/errorkit"
"go.llib.dev/frameless/pkg/httpkit/rfc7807"
)
type CompanyErrorStructure struct {
Code string `json:"code"`
Message string `json:"message"`
}
const ErrSomeRandom errorkit.Error = "random error value"
func ErrorMapping(ctx context.Context, err error, dto *rfc7807.DTO) {
switch {
case errors.Is(err, ErrSomeRandom):
dto.Type.ID = "some-random-err"
dto.Detail = "this is a random error type"
}
dto.Extensions = CompanyErrorStructure{
Code: dto.Type.ID,
Message: dto.Detail,
}
}
func main() {
h := rfc7807.Handler{
Mapping: ErrorMapping,
BaseURL: "/errors",
}
_ = func(w http.ResponseWriter, r *http.Request) {
h.HandleError(w, r, ErrSomeRandom)
}
}
Click to show internal directories.
Click to hide internal directories.