diff --git a/pagination.go b/pagination.go index ee19c44..6c100bb 100644 --- a/pagination.go +++ b/pagination.go @@ -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 }