package errorsimport ()var (// The function used to encode errors and their tags.Encoderfunc(any) ([]byte, error))func init() {SetInlineEncoder()}// SetInlineEncoder is a helper function that set the error encoder to// json.Marshal.func () {Encoder = json.Marshal}// SetIndentEncoder is a helper function that set the error encoder to a// function that uses json.MarshalIndent.func () {Encoder = func( any) ([]byte, error) {returnjson.MarshalIndent(, "", " ") }}// Unwrap returns the result of calling the Unwrap method on err, if err's type// contains an Unwrap method returning error.// Otherwise, Unwrap returns nil.func ( error) error {returnerrors.Unwrap()}// Is reports whether any error in err's chain matches target.//// The chain consists of err itself followed by the sequence of errors obtained// by repeatedly calling Unwrap.//// An error is considered to match a target if it is equal to that target or if// it implements a method Is(error) bool such that Is(target) returns true.//// An error type might provide an Is method so it can be treated as equivalent// to an existing error. For example, if MyError defines//// func (m MyError) Is(target error) bool { return target == fs.ErrExist }//// then Is(MyError{}, fs.ErrExist) returns true. See syscall.Errno.Is for an// example in the standard library. An Is method should only shallowly compare// err and the target and not call Unwrap on either.func (, error) bool {returnerrors.Is(, )}// As finds the first error in err's chain that matches target, and if one is// found, sets target to that error value and returns true. Otherwise, it// returns false.//// The chain consists of err itself followed by the sequence of errors obtained// by repeatedly calling Unwrap.//// An error matches target if the error's concrete value is assignable to the// value pointed to by target, or if the error has a method As(any) bool// such that As(target) returns true. In the latter case, the As method is// responsible for setting target.//// An error type might provide an As method so it can be treated as if it were a// different error type.//// As panics if target is not a non-nil pointer to either a type that implements// error, or to any interface type.func ( error, any) bool {returnerrors.As(, )}// Type returns the type of the error.//// Uses reflect.TypeOf() when the given error does not implements the Error// interface.func ( error) string {if == nil {return"" }if , := .(interface{ () string }); {return .() }returnreflect.TypeOf().String()}// HasType reports whether any error in err's chain matches the given type.//// The chain consists of err itself followed by the sequence of errors obtained// by repeatedly calling Unwrap.//// An error matches the given type if the error has a method Type() string such// that Type() returns a string equal to the given type.func ( error, string) bool {for {if == Type() {returntrue }if = Unwrap(); == nil {returnfalse } }}// Tag returns the first tag value in err's chain that matches the given key.//// The chain consists of err itself followed by the sequence of errors obtained// by repeatedly calling Unwrap.//// An error has a tag when it has a method Tag(string) string such that Tag(k)// returns a non-empty string value.func ( error, string) any {for {if , := .(Error); {if := .Tag(); != nil {return } }if = Unwrap(); == nil {returnnil } }}// An enriched error.typeErrorstruct { Line string Message string DefinedType string Tags map[string]any WrappedErr error}// New returns an error with the given message that can be enriched with a type// and tags.func ( string) Error {returnmakeError()}// Newf returns an error with the given formatted message that can be enriched// with a type and tags.func ( string, ...any) Error {returnmakeError(, ...)}func makeError( string, ...any) Error { , , , := runtime.Caller(2) := Error{Line: fmt.Sprintf("%s:%v", filepath.Base(), ),Message: fmt.Sprintf(, ...), }return}func ( Error) ( string) Error { .DefinedType = return}func ( Error) () string {if .DefinedType != "" {return .DefinedType }if .WrappedErr != nil {returnType(.WrappedErr) }returnreflect.TypeOf().String()}func ( Error) ( string, any) Error {if .Tags == nil { .Tags = make(map[string]any) } .Tags[] = return}func ( Error) ( string) any {return .Tags[]}func ( Error) ( error) Error { .WrappedErr = return}func ( Error) () error {return .WrappedErr}func ( Error) () string { , := Encoder()if != nil {returnfmt.Sprintf(`{"message": "encoding error failed: %s"}`, ) }returnstring()}func ( Error) () ([]byte, error) {varany = .WrappedErrif , := .WrappedErr.(Error); ! && .WrappedErr != nil { = .WrappedErr.Error() }varmap[string]anyif := len(.Tags); != 0 { = make(map[string]any, )for , := range .Tags {switch v := .(type) {casereflect.Type: [] = .String()default: [] = } } }returnEncoder(struct {string`json:"line,omitempty"`string`json:"message"`string`json:"type,omitempty"`map[string]any`json:"tags,omitempty"`any`json:"wrap,omitempty"` }{ : .Line, : .Message, : .DefinedType, : , : , })}func ( Error) ( error) bool { , := .(Error)if ! {returnfalse }return .Line == .Line && .Message == .Message && .DefinedType == .DefinedType &&reflect.DeepEqual(.Tags, .Tags) && .WrappedErr == .WrappedErr}
The pages are generated with Goldsv0.8.7. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.