reflux/errors.go

232 lines
8.3 KiB
Go

package reflux
import (
"errors"
"fmt"
"reflect"
)
// 预定义的基础错误
// ErrEmptyPath 表示路径为空
var ErrEmptyPath = errors.New("rfx: empty path")
// ErrAppendNotSupported 表示 Append 操作不支持当前类型
var ErrAppendNotSupported = errors.New("rfx: Append only supports slice type")
// ErrAppendNilValue 表示无法向 nil 值追加
var ErrAppendNilValue = errors.New("rfx: cannot append to nil value")
// ErrNilPointerInPath 表示路径中存在 nil 指针或接口
var ErrNilPointerInPath = errors.New("rfx: nil pointer/interface in path")
// ErrInvalidValueInPath 表示路径中的值无效
var ErrInvalidValueInPath = errors.New("rfx: invalid value in path")
// ErrValueCannotBeSet 表示值无法被设置
var ErrValueCannotBeSet = errors.New("rfx: value cannot be set")
// ErrTargetNilPointer 表示目标是 nil 指针或接口
var ErrTargetNilPointer = errors.New("rfx: target is nil pointer/interface")
// ErrInvalidValue 表示值无效的基础错误
var ErrInvalidValue = errors.New("rfx: invalid value")
// ErrCannotSet 表示无法设置的基础错误
var ErrCannotSet = errors.New("rfx: cannot set value")
// ErrFieldNotFound 表示字段不存在的基础错误
var ErrFieldNotFound = errors.New("rfx: field not found")
// ErrKeyNotFound 表示键不存在的基础错误
var ErrKeyNotFound = errors.New("rfx: key not found")
// ErrValueNotFound 表示值不存在的基础错误
var ErrValueNotFound = errors.New("rfx: value not found")
// ErrInvalidIndex 表示索引无效的基础错误
var ErrInvalidIndex = errors.New("rfx: invalid index")
// ErrElementInvalid 表示元素无效的基础错误
var ErrElementInvalid = errors.New("rfx: element invalid")
// ErrUnsupportedType 表示不支持的类型的基础错误
var ErrUnsupportedType = errors.New("rfx: unsupported type")
// ErrCannotAssign 表示无法赋值的基础错误
var ErrCannotAssign = errors.New("rfx: cannot assign value")
// ErrIndexOutOfRange 表示索引越界的基础错误
var ErrIndexOutOfRange = errors.New("rfx: index out of range")
// ErrNormalizeFailed 表示规范化失败的基础错误
var ErrNormalizeFailed = errors.New("rfx: normalize failed")
// ErrCannotConvert 表示无法转换的基础错误
var ErrCannotConvert = errors.New("rfx: cannot convert")
// ErrSetFailed 表示设置失败的基础错误
var ErrSetFailed = errors.New("rfx: set failed")
// ErrInvalidValue 相关
// NewErrInvalidValueForPath 创建路径值无效错误
func NewErrInvalidValueForPath(path string) error {
return fmt.Errorf("%w for path '%s'", ErrInvalidValue, path)
}
// ErrCannotSet 相关
// NewErrCannotSetPath 创建无法设置路径错误
func NewErrCannotSetPath(path string) error {
return fmt.Errorf("%w at path '%s'", ErrCannotSet, path)
}
// NewErrFieldCannotSet 创建字段无法设置错误
func NewErrFieldCannotSet(fieldName string, fieldType reflect.Type) error {
return fmt.Errorf("%w, field '%s' (type: %s) (unexported or not addressable)", ErrCannotSet, fieldName, fieldType)
}
// NewErrSliceElementCannotSet 创建切片元素无法设置错误
func NewErrSliceElementCannotSet(index int) error {
return fmt.Errorf("%w, slice element at index %d", ErrCannotSet, index)
}
// NewErrArrayElementCannotSet 创建数组元素无法设置错误
func NewErrArrayElementCannotSet(index int) error {
return fmt.Errorf("%w, array element at index %d", ErrCannotSet, index)
}
// ErrSetFailed 相关
// NewErrSetFailed 创建设置失败错误(包装底层错误)
func NewErrSetFailed(path string, err error) error {
return fmt.Errorf("%w at path '%s': %w", ErrSetFailed, path, err)
}
// NewErrSetSliceElementFailed 创建设置切片元素失败错误
func NewErrSetSliceElementFailed(index int, err error) error {
return fmt.Errorf("%w, slice element at index %d: %w", ErrSetFailed, index, err)
}
// NewErrSetStructFieldFailed 创建设置结构体字段失败错误
func NewErrSetStructFieldFailed(fieldName string, err error) error {
return fmt.Errorf("%w, struct field '%s': %w", ErrSetFailed, fieldName, err)
}
// Append 相关
// NewErrAppendItemFailed 创建追加元素失败错误
func NewErrAppendItemFailed(index int, err error) error {
return fmt.Errorf("rfx: failed to append item at index %d to slice: %w", index, err)
}
// ErrFieldNotFound / ErrKeyNotFound / ErrValueNotFound 相关
// NewErrFieldNotFound 创建字段不存在错误
func NewErrFieldNotFound(fieldName string) error {
return fmt.Errorf("%w, '%s' in struct", ErrFieldNotFound, fieldName)
}
// NewErrFieldNotFoundInStruct 创建结构体中字段不存在错误(包含类型信息)
func NewErrFieldNotFoundInStruct(fieldName string, structType reflect.Type) error {
return fmt.Errorf("%w, '%s' in struct %s", ErrFieldNotFound, fieldName, structType)
}
// NewErrKeyNotFound 创建键不存在错误
func NewErrKeyNotFound(key string) error {
return fmt.Errorf("%w, '%s' in map", ErrKeyNotFound, key)
}
// NewErrValueNotFound 创建值不存在错误
func NewErrValueNotFound(key string) error {
return fmt.Errorf("%w for key '%s' in map", ErrValueNotFound, key)
}
// ErrInvalidIndex / ErrIndexOutOfRange / ErrElementInvalid 相关
// NewErrInvalidIndex 创建索引无效错误
func NewErrInvalidIndex(index string, length int) error {
return fmt.Errorf("%w, '%s' for slice/array (len=%d)", ErrInvalidIndex, index, length)
}
// NewErrInvalidSliceIndex 创建切片索引无效错误
func NewErrInvalidSliceIndex(index string, err error) error {
return fmt.Errorf("%w, slice index '%s': %w", ErrInvalidIndex, index, err)
}
// NewErrInvalidArrayIndex 创建数组索引无效错误
func NewErrInvalidArrayIndex(index string, err error) error {
return fmt.Errorf("%w, array index '%s': %w", ErrInvalidIndex, index, err)
}
// NewErrSliceIndexOutOfRange 创建切片索引越界错误
func NewErrSliceIndexOutOfRange(index, length int) error {
return fmt.Errorf("%w, slice index %d (len=%d)", ErrIndexOutOfRange, index, length)
}
// NewErrArrayIndexOutOfRange 创建数组索引越界错误
func NewErrArrayIndexOutOfRange(index, length int) error {
return fmt.Errorf("%w, array index %d (len=%d)", ErrIndexOutOfRange, index, length)
}
// NewErrElementInvalid 创建元素无效错误
func NewErrElementInvalid(index string) error {
return fmt.Errorf("%w at index '%s'", ErrElementInvalid, index)
}
// ErrUnsupportedType 相关
// NewErrUnsupportedType 创建不支持的类型错误
func NewErrUnsupportedType(kind reflect.Kind, key string) error {
return fmt.Errorf("%w, %s at key '%s'", ErrUnsupportedType, kind, key)
}
// NewErrUnsupportedTargetType 创建不支持的目标类型错误
func NewErrUnsupportedTargetType(kind reflect.Kind) error {
return fmt.Errorf("%w, %s", ErrUnsupportedType, kind)
}
// NewErrUnsupportedTargetTypeForValue 创建不支持的目标类型错误(包含值类型)
func NewErrUnsupportedTargetTypeForValue(targetType reflect.Type, inputType string) error {
return fmt.Errorf("%w, target %s for value type %s", ErrUnsupportedType, targetType, inputType)
}
// ErrCannotAssign 相关
// NewErrCannotAssign 创建无法赋值错误
func NewErrCannotAssign(valueType, targetType reflect.Type) error {
return fmt.Errorf("%w, type %s to map value type %s", ErrCannotAssign, valueType, targetType)
}
// ErrNormalizeFailed 相关
// NewErrNormalizeInputFailed 创建输入规范化失败错误
func NewErrNormalizeInputFailed(err error) error {
return fmt.Errorf("%w, input value: %w", ErrNormalizeFailed, err)
}
// ErrCannotConvert 相关
// NewErrCannotConvertToSlice 创建无法转换为切片错误
func NewErrCannotConvertToSlice(sourceType, targetType reflect.Type) error {
return fmt.Errorf("%w, %s to slice type %s", ErrCannotConvert, sourceType, targetType)
}
// NewErrCannotConvertToStruct 创建无法转换为结构体错误
func NewErrCannotConvertToStruct(sourceType, targetType reflect.Type) error {
return fmt.Errorf("%w, %s to struct type %s", ErrCannotConvert, sourceType, targetType)
}
// NewErrCannotConvertValue 创建无法转换值错误
func NewErrCannotConvertValue(inputType string, targetType reflect.Type, err error) error {
return fmt.Errorf("%w, value of type %s to target type %s: %w", ErrCannotConvert, inputType, targetType, err)
}
// 其他
// NewErrUnmarshalFailed 创建反序列化失败错误
func NewErrUnmarshalFailed(targetType reflect.Type, err error) error {
return fmt.Errorf("rfx: failed to unmarshal JSON into type %s: %w", targetType, err)
}