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 }