Path: blob/main/vendor/github.com/go-viper/mapstructure/v2/errors.go
2880 views
package mapstructure12import (3"errors"4"fmt"5"net"6"net/url"7"reflect"8"strconv"9"strings"10"time"11)1213// Error interface is implemented by all errors emitted by mapstructure.14//15// Use [errors.As] to check if an error implements this interface.16type Error interface {17error1819mapstructure()20}2122// DecodeError is a generic error type that holds information about23// a decoding error together with the name of the field that caused the error.24type DecodeError struct {25name string26err error27}2829func newDecodeError(name string, err error) *DecodeError {30return &DecodeError{31name: name,32err: err,33}34}3536func (e *DecodeError) Name() string {37return e.name38}3940func (e *DecodeError) Unwrap() error {41return e.err42}4344func (e *DecodeError) Error() string {45return fmt.Sprintf("'%s' %s", e.name, e.err)46}4748func (*DecodeError) mapstructure() {}4950// ParseError is an error type that indicates a value could not be parsed51// into the expected type.52type ParseError struct {53Expected reflect.Value54Value any55Err error56}5758func (e *ParseError) Error() string {59return fmt.Sprintf("cannot parse value as '%s': %s", e.Expected.Type(), e.Err)60}6162func (*ParseError) mapstructure() {}6364// UnconvertibleTypeError is an error type that indicates a value could not be65// converted to the expected type.66type UnconvertibleTypeError struct {67Expected reflect.Value68Value any69}7071func (e *UnconvertibleTypeError) Error() string {72return fmt.Sprintf(73"expected type '%s', got unconvertible type '%s'",74e.Expected.Type(),75reflect.TypeOf(e.Value),76)77}7879func (*UnconvertibleTypeError) mapstructure() {}8081func wrapStrconvNumError(err error) error {82if err == nil {83return nil84}8586if err, ok := err.(*strconv.NumError); ok {87return &strconvNumError{Err: err}88}8990return err91}9293type strconvNumError struct {94Err *strconv.NumError95}9697func (e *strconvNumError) Error() string {98return "strconv." + e.Err.Func + ": " + e.Err.Err.Error()99}100101func (e *strconvNumError) Unwrap() error { return e.Err }102103func wrapUrlError(err error) error {104if err == nil {105return nil106}107108if err, ok := err.(*url.Error); ok {109return &urlError{Err: err}110}111112return err113}114115type urlError struct {116Err *url.Error117}118119func (e *urlError) Error() string {120return fmt.Sprintf("%s", e.Err.Err)121}122123func (e *urlError) Unwrap() error { return e.Err }124125func wrapNetParseError(err error) error {126if err == nil {127return nil128}129130if err, ok := err.(*net.ParseError); ok {131return &netParseError{Err: err}132}133134return err135}136137type netParseError struct {138Err *net.ParseError139}140141func (e *netParseError) Error() string {142return "invalid " + e.Err.Type143}144145func (e *netParseError) Unwrap() error { return e.Err }146147func wrapTimeParseError(err error) error {148if err == nil {149return nil150}151152if err, ok := err.(*time.ParseError); ok {153return &timeParseError{Err: err}154}155156return err157}158159type timeParseError struct {160Err *time.ParseError161}162163func (e *timeParseError) Error() string {164if e.Err.Message == "" {165return fmt.Sprintf("parsing time as %q: cannot parse as %q", e.Err.Layout, e.Err.LayoutElem)166}167168return "parsing time " + e.Err.Message169}170171func (e *timeParseError) Unwrap() error { return e.Err }172173func wrapNetIPParseAddrError(err error) error {174if err == nil {175return nil176}177178if errMsg := err.Error(); strings.HasPrefix(errMsg, "ParseAddr") {179errPieces := strings.Split(errMsg, ": ")180181return fmt.Errorf("ParseAddr: %s", errPieces[len(errPieces)-1])182}183184return err185}186187func wrapNetIPParseAddrPortError(err error) error {188if err == nil {189return nil190}191192errMsg := err.Error()193if strings.HasPrefix(errMsg, "invalid port ") {194return errors.New("invalid port")195} else if strings.HasPrefix(errMsg, "invalid ip:port ") {196return errors.New("invalid ip:port")197}198199return err200}201202func wrapNetIPParsePrefixError(err error) error {203if err == nil {204return nil205}206207if errMsg := err.Error(); strings.HasPrefix(errMsg, "netip.ParsePrefix") {208errPieces := strings.Split(errMsg, ": ")209210return fmt.Errorf("netip.ParsePrefix: %s", errPieces[len(errPieces)-1])211}212213return err214}215216func wrapTimeParseDurationError(err error) error {217if err == nil {218return nil219}220221errMsg := err.Error()222if strings.HasPrefix(errMsg, "time: unknown unit ") {223return errors.New("time: unknown unit")224} else if strings.HasPrefix(errMsg, "time: ") {225idx := strings.LastIndex(errMsg, " ")226227return errors.New(errMsg[:idx])228}229230return err231}232233func wrapTimeParseLocationError(err error) error {234if err == nil {235return nil236}237errMsg := err.Error()238if strings.Contains(errMsg, "unknown time zone") || strings.HasPrefix(errMsg, "time: unknown format") {239return fmt.Errorf("invalid time zone format: %w", err)240}241242return err243}244245246