Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
- internal/ghl/oauth.go: acknowledge fmt.Fprint return (errcheck) - internal/ghl/api.go: handle io.ReadAll error instead of discarding (errcheck) - internal/cast/client.go: replace defer-in-loop with explicit Body.Close after ReadAll (gocritic defer-in-loop) - internal/phone/normalize.go: move inline regexp.MustCompile to package-level var e164Pattern (gocritic / performance) Co-Authored-By: Paperclip <noreply@paperclip.ing>
72 lines
2.0 KiB
Go
72 lines
2.0 KiB
Go
package phone
|
|
|
|
import (
|
|
"errors"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
var nonDigit = regexp.MustCompile(`[^\d]`)
|
|
var e164Pattern = regexp.MustCompile(`^\+63\d{10}$`)
|
|
|
|
// ToLocal converts a phone number to Philippine local format (09XXXXXXXXX).
|
|
func ToLocal(e164 string) (string, error) {
|
|
if e164 == "" {
|
|
return "", errors.New("invalid Philippine phone number: empty input")
|
|
}
|
|
digits := nonDigit.ReplaceAllString(e164, "")
|
|
if digits == "" {
|
|
return "", errors.New("invalid Philippine phone number: no digits found")
|
|
}
|
|
|
|
var local string
|
|
switch {
|
|
case strings.HasPrefix(digits, "63") && len(digits) == 12:
|
|
local = "0" + digits[2:]
|
|
case strings.HasPrefix(digits, "9") && len(digits) == 10:
|
|
local = "0" + digits
|
|
case strings.HasPrefix(digits, "0") && len(digits) == 11:
|
|
local = digits
|
|
default:
|
|
return "", errors.New("invalid Philippine phone number")
|
|
}
|
|
|
|
if len(local) != 11 || !strings.HasPrefix(local, "09") {
|
|
return "", errors.New("invalid Philippine phone number")
|
|
}
|
|
return local, nil
|
|
}
|
|
|
|
// ToE164 converts a phone number to E.164 format (+63XXXXXXXXXX).
|
|
func ToE164(local string) (string, error) {
|
|
if local == "" {
|
|
return "", errors.New("invalid Philippine phone number: empty input")
|
|
}
|
|
|
|
// preserve leading + before stripping
|
|
hasPlus := strings.HasPrefix(local, "+")
|
|
digits := nonDigit.ReplaceAllString(local, "")
|
|
if digits == "" {
|
|
return "", errors.New("invalid Philippine phone number: no digits found")
|
|
}
|
|
|
|
var e164 string
|
|
switch {
|
|
case hasPlus && strings.HasPrefix(digits, "63") && len(digits) == 12:
|
|
e164 = "+" + digits
|
|
case !hasPlus && strings.HasPrefix(digits, "63") && len(digits) == 12:
|
|
e164 = "+" + digits
|
|
case strings.HasPrefix(digits, "0") && len(digits) == 11:
|
|
e164 = "+63" + digits[1:]
|
|
case strings.HasPrefix(digits, "9") && len(digits) == 10:
|
|
e164 = "+63" + digits
|
|
default:
|
|
return "", errors.New("invalid Philippine phone number")
|
|
}
|
|
|
|
if !e164Pattern.MatchString(e164) {
|
|
return "", errors.New("invalid Philippine phone number")
|
|
}
|
|
return e164, nil
|
|
}
|