Head of Product & Engineering 12c547d215
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
fix: address remaining golangci-lint warnings
- 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>
2026-04-05 21:33:03 +02:00

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
}