| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | // Package errors is a drop-in replacement for Golang lib 'errors'.package errorsimport (	"fmt"	"v2ray.com/core/common/serial")type hasInnerError interface {	// Inner returns the underlying error of this one.	Inner() error}// Error is an error object with underlying error.type Error struct {	message string	inner   error}// Error implements error.Error().func (v *Error) Error() string {	return v.message}// Inner implements hasInnerError.Inner()func (v *Error) Inner() error {	if v.inner == nil {		return nil	}	return v.inner}// New returns a new error object with message formed from given arguments.func New(msg ...interface{}) error {	return &Error{		message: serial.Concat(msg...),	}}// Base returns an ErrorBuilder based on the given error.func Base(err error) ErrorBuilder {	return ErrorBuilder{		error: err,	}}func Format(format string, values ...interface{}) error {	return New(fmt.Sprintf(format, values...))}// Cause returns the root cause of this error.func Cause(err error) error {	if err == nil {		return nil	}	for {		inner, ok := err.(hasInnerError)		if !ok {			break		}		if inner.Inner() == nil {			break		}		err = inner.Inner()	}	return err}type ErrorBuilder struct {	error}// Message returns an error object with given message and base error.func (v ErrorBuilder) Message(msg ...interface{}) error {	if v.error == nil {		return nil	}	return &Error{		message: serial.Concat(msg...) + " > " + v.error.Error(),		inner:   v.error,	}}// Format returns an errors object with given message format and base error.func (v ErrorBuilder) Format(format string, values ...interface{}) error {	if v.error == nil {		return nil	}	return &Error{		message: fmt.Sprintf(format, values...) + " > " + v.error.Error(),		inner:   v.error,	}}
 |