refactor: add custom error types for better error handling

This commit is contained in:
2026-01-01 20:39:59 +01:00
parent 718fb0b17c
commit 6409d9b2aa
+18 -8
View File
@@ -2,28 +2,38 @@ package pagination
import ( import (
"encoding/base64" "encoding/base64"
"fmt" "errors"
"slices" "slices"
) )
var (
ErrFirstAndLastProvided = errors.New("only one of first and last can be provided")
ErrFirstNegative = errors.New("first must be greater than 0")
ErrLastNegative = errors.New("last must be greater than 0")
ErrAfterAndBeforeProvided = errors.New("only one of after and before can be provided")
ErrInvalidAfterCursor = errors.New("after is not a valid cursor")
ErrInvalidBeforeCursor = errors.New("before is not a valid cursor")
ErrInvalidCursor = errors.New("invalid cursor")
)
func Validate(first *int, after *string, last *int, before *string) error { func Validate(first *int, after *string, last *int, before *string) error {
if first != nil && last != nil { if first != nil && last != nil {
return fmt.Errorf("only one of first and last can be provided") return ErrFirstAndLastProvided
} }
if first != nil && *first < 0 { if first != nil && *first < 0 {
return fmt.Errorf("first must be greater than 0") return ErrFirstNegative
} }
if last != nil && *last < 0 { if last != nil && *last < 0 {
return fmt.Errorf("last must be greater than 0") return ErrLastNegative
} }
if after != nil && len(*after) > 0 && before != nil && len(*before) > 0 { if after != nil && len(*after) > 0 && before != nil && len(*before) > 0 {
return fmt.Errorf("only one of after and before can be provided") return ErrAfterAndBeforeProvided
} }
if ValidateCursor(after) != nil { if ValidateCursor(after) != nil {
return fmt.Errorf("after is not a valid cursor") return ErrInvalidAfterCursor
} }
if ValidateCursor(before) != nil { if ValidateCursor(before) != nil {
return fmt.Errorf("before is not a valid cursor") return ErrInvalidBeforeCursor
} }
return nil return nil
} }
@@ -42,7 +52,7 @@ func DecodeCursor(cursor *string) (string, error) {
} }
b64, err := base64.StdEncoding.DecodeString(*cursor) b64, err := base64.StdEncoding.DecodeString(*cursor)
if err != nil { if err != nil {
return "", err return "", ErrInvalidCursor
} }
return string(b64), nil return string(b64), nil
} }