75 lines
2.1 KiB
Go
75 lines
2.1 KiB
Go
package phone
|
|
|
|
import (
|
|
"errors"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
// Define the regex patterns as constants
|
|
const (
|
|
// TODO: This should rather use a phone package to determine whether valid phone number for any region.
|
|
// Kenyan phone numbers: must be exactly 10 digits (07XXXXXXXX or 01XXXXXXXX) when starting with 0
|
|
// Or start with 254 / +254 and still follow the same pattern
|
|
phoneRegex = `^(?:\+254|254|0)(7\d{8}|1[01]\d{7})$`
|
|
)
|
|
|
|
// IsValidPhoneNumber checks if the given number is a valid phone number
|
|
func IsValidPhoneNumber(phonenumber string) bool {
|
|
match, _ := regexp.MatchString(phoneRegex, phonenumber)
|
|
return match
|
|
}
|
|
|
|
// FormatPhoneNumber formats a Kenyan phone number to "+254xxxxxxxx".
|
|
func FormatPhoneNumber(phone string) (string, error) {
|
|
if !IsValidPhoneNumber(phone) {
|
|
return "", errors.New("invalid phone number")
|
|
}
|
|
|
|
// Remove any leading "+" and spaces
|
|
phone = strings.TrimPrefix(phone, "+")
|
|
phone = strings.ReplaceAll(phone, " ", "")
|
|
|
|
// Replace leading "0" with "254" if present
|
|
if strings.HasPrefix(phone, "0") {
|
|
phone = "254" + phone[1:]
|
|
}
|
|
// Add "+" if not already present
|
|
if !strings.HasPrefix(phone, "254") {
|
|
return "", errors.New("unexpected format")
|
|
}
|
|
|
|
return "+" + phone, nil
|
|
}
|
|
|
|
// FormatToLocalPhoneNumber converts a phone number like "+2547XXXXXXXX"
|
|
// or "2547XXXXXXXX" into the local format "07XXXXXXXX" / "01XXXXXXXX".
|
|
func FormatToLocalPhoneNumber(phone string) (string, error) {
|
|
// Remove leading "+" and spaces
|
|
phone = strings.TrimPrefix(phone, "+")
|
|
phone = strings.ReplaceAll(phone, " ", "")
|
|
|
|
// Must start with 254
|
|
if !strings.HasPrefix(phone, "254") {
|
|
return "", errors.New("invalid international phone format")
|
|
}
|
|
|
|
// Remove "254" prefix → get 7XXXXXXXX or 1XXXXXXXX
|
|
rest := phone[3:]
|
|
|
|
// Validate: must be 9 digits
|
|
if len(rest) != 9 {
|
|
return "", errors.New("invalid phone number length")
|
|
}
|
|
|
|
// Kenyan mobile numbers start with 7 or 1 (Safaricom/Airtel/Telkom prefixes)
|
|
if !(strings.HasPrefix(rest, "7") || strings.HasPrefix(rest, "1")) {
|
|
return "", errors.New("invalid Kenyan mobile prefix")
|
|
}
|
|
|
|
// Convert to local: prepend "0"
|
|
local := "0" + rest
|
|
|
|
return local, nil
|
|
}
|