Files
terminalShop/pkg/validate/validate.go
marcusDenslow 92d5c46e19 revert and update: reverted shippo logic and changed error msg in TUI
a while back i made shippo skip "validate" addresses that didnt
specifically fail the validation process. this meant that addresses
outside the us worked as long as they didnt specifically return false.
this is now reverted to test actual validaion.

also changed some error messages in the TUI so that the entire message
type is not also printed, just the message
2026-02-28 22:26:01 +01:00

118 lines
2.4 KiB
Go

package validate
import (
"fmt"
"net/mail"
)
type ErrorHandler func(str string) error
func WithinLen(min, max int, name string) ErrorHandler {
return func(str string) error {
if len(str) >= min && len(str) <= max {
return nil
}
return fmt.Errorf(
"expected %s to be between %d and %d, but got %d",
name,
min,
max,
len(str),
)
}
}
func CcnValidator(cardNumber string) error {
if len(cardNumber) < 13 {
return fmt.Errorf("invalid credit card number")
}
total := 0
isSecondDigit := false
// Iterate through the card number digits in reverse order
for i := len(cardNumber) - 1; i >= 0; i-- {
// Skip spaces or any other non-digit characters
if cardNumber[i] < '0' || cardNumber[i] > '9' {
continue
}
// Convert the digit character to an integer
digit := int(cardNumber[i] - '0')
if isSecondDigit {
// Double the digit for each second digit from the right
digit *= 2
if digit > 9 {
// If doubling the digit results in a two-digit number, subtract 9 to get the sum of digits
digit -= 9
}
}
// Add the current digit to the total sum
total += digit
// Toggle the flag for the next iteration
isSecondDigit = !isSecondDigit
}
// Check if the total sum mod 10 is not zero (valid card numbers should result in total mod 10 == 0)
if total%10 != 0 {
return fmt.Errorf("invalid credit card number")
}
return nil
}
func IsDigits(name string) ErrorHandler {
return func(str string) error {
for _, c := range str {
if !(c >= '0' && c <= '9') {
return fmt.Errorf("[%s] expected only digits but got %s", name, str)
}
}
return nil
}
}
func MustBeLen(length int, name string) ErrorHandler {
return func(str string) error {
if str == "" {
return nil
}
if len(str) != length {
return fmt.Errorf("expected %s to be length %d but got %d", name, length, len(str))
}
return nil
}
}
func NotEmpty(name string) ErrorHandler {
return func(str string) error {
if len(str) == 0 {
return fmt.Errorf("%s cannot be empty", name)
}
return nil
}
}
func EmailValidator(str string) error {
_, err := mail.ParseAddress(str)
if err != nil {
return fmt.Errorf("not a valid email address")
}
return nil
}
func Compose(input ...ErrorHandler) ErrorHandler {
return func(str string) error {
for _, f := range input {
err := f(str)
if err != nil {
return err
}
}
return nil
}
}