232 lines
8.3 KiB
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)
|
|
}
|