Ctrl K
ComunidadGuías…

pkg/errors/errors.go

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package errors

import (
	"errors"
)

// Data is a custom type to carry error's metadata.
// It can be any data type, but a struct is recommended due its fine control on JSON marshalling for each field.
type Data any

// Error is a custom error that carry attributes to specify error's message, resource, layer, code and data.
type Error struct {
	// message is the error message.
	Message string `json:"message"`
	// Layer is the error layer.
	Layer string `json:"layer,omitempty"`
	// Code is the error code.
	Code int `json:"code,omitempty"`
	// Data is the error metadata.
	Data Data `json:"data,omitempty"`
}

// New creates a new [Error].
func New(message, layer string, code int) error {
	return Error{
		Message: message,
		Layer:   layer,
		Code:    code,
		Data:    nil,
	}
}

// WithData insiert [Data] into parent is from type [Error].
func WithData(parent error, data Data) error {
	if parent == nil {
		return nil
	}

	if err, ok := errors.AsType[Error](parent); ok {
		err.Data = data

		return err
	}

	return nil
}

func (e Error) Error() string {
	return e.Message
}

// Is ignores Data so that WithData copies still match their sentinel.
func (e Error) Is(target error) bool {
	t, ok := target.(Error)
	if !ok {
		return false
	}

	return e.Message == t.Message && e.Layer == t.Layer && e.Code == t.Code
}

// Wrap wraps an error with another error.
//
// It is a interface for [errors.Join]. Check [errors.Join] for more information.
func Wrap(err error, next error) error {
	return errors.Join(err, next)
}

// As wraps [errors.As]. Check [errors.As] for more information.
func As(err error, target any) bool {
	return errors.As(err, target)
}

// Is wraps [errors.Is]. Check [errors.Is] for more information.
func Is(err, target error) bool {
	return errors.Is(err, target)
}