42 lines
1.3 KiB
Go
42 lines
1.3 KiB
Go
package util
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
"regexp"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
// ErrInvalidPhoneNumber means a phone number is not an Indonesian mobile number.
|
||
|
|
var ErrInvalidPhoneNumber = errors.New("invalid phone number format")
|
||
|
|
|
||
|
|
// customerPhonePattern is an Indonesian mobile number in its stored form: 62, then the
|
||
|
|
// number without its leading 0 (628…, 10 to 14 digits in all).
|
||
|
|
var customerPhonePattern = regexp.MustCompile(`^628\d{7,11}$`)
|
||
|
|
|
||
|
|
// NormalizePhoneNumber turns a customer's phone number into the one form it is stored
|
||
|
|
// and looked up in, 62…: "0812-3456-1234", "+62 812 3456 1234", "62812…" and "812…"
|
||
|
|
// all become "6281234561234". Spaces, dashes, dots and parentheses are dropped.
|
||
|
|
func NormalizePhoneNumber(raw string) (string, error) {
|
||
|
|
digits := strings.Map(func(r rune) rune {
|
||
|
|
switch r {
|
||
|
|
case ' ', '-', '.', '(', ')':
|
||
|
|
return -1
|
||
|
|
}
|
||
|
|
return r
|
||
|
|
}, strings.TrimSpace(raw))
|
||
|
|
digits = strings.TrimPrefix(digits, "+")
|
||
|
|
switch {
|
||
|
|
case strings.HasPrefix(digits, "620"):
|
||
|
|
// +62 typed in front of a number that kept its 0.
|
||
|
|
digits = "62" + digits[3:]
|
||
|
|
case strings.HasPrefix(digits, "0"):
|
||
|
|
digits = "62" + digits[1:]
|
||
|
|
case strings.HasPrefix(digits, "8"):
|
||
|
|
digits = "62" + digits
|
||
|
|
}
|
||
|
|
if !customerPhonePattern.MatchString(digits) {
|
||
|
|
return "", ErrInvalidPhoneNumber
|
||
|
|
}
|
||
|
|
return digits, nil
|
||
|
|
}
|