refactor: add custom error types for better error handling #63

Merged
argoyle merged 1 commits from refactor/custom-error-types into main 2026-01-01 20:35:55 +00:00
+18 -8
View File
@@ -2,28 +2,38 @@ package pagination
import (
"encoding/base64"
"fmt"
"errors"
"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 {
if first != nil && last != nil {
return fmt.Errorf("only one of first and last can be provided")
return ErrFirstAndLastProvided
}
if first != nil && *first < 0 {
return fmt.Errorf("first must be greater than 0")
return ErrFirstNegative
}
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 {
return fmt.Errorf("only one of after and before can be provided")
return ErrAfterAndBeforeProvided
}
if ValidateCursor(after) != nil {
return fmt.Errorf("after is not a valid cursor")
return ErrInvalidAfterCursor
}
if ValidateCursor(before) != nil {
return fmt.Errorf("before is not a valid cursor")
return ErrInvalidBeforeCursor
}
return nil
}
@@ -42,7 +52,7 @@ func DecodeCursor(cursor *string) (string, error) {
}
b64, err := base64.StdEncoding.DecodeString(*cursor)
if err != nil {
return "", err
return "", ErrInvalidCursor
}
return string(b64), nil
}