aboutsummaryrefslogtreecommitdiffstats
path: root/phone.go
diff options
context:
space:
mode:
Diffstat (limited to 'phone.go')
-rw-r--r--phone.go36
1 files changed, 36 insertions, 0 deletions
diff --git a/phone.go b/phone.go
new file mode 100644
index 0000000..ff92cef
--- /dev/null
+++ b/phone.go
@@ -0,0 +1,36 @@
+package lulu
+
+import (
+ "fmt"
+ "regexp"
+)
+
+var phoneExpr = regexp.MustCompile(`^\+?[\d\s\-.\/()]{8,20}$`)
+
+type PhoneNumber string
+
+func ParsePhoneNumber(s string) (PhoneNumber, error) {
+ if phoneExpr.MatchString(s) {
+ return PhoneNumber(s), nil
+ }
+ return "", fmt.Errorf("malformed phone number %q; must fit pattern `%s`", s, phoneExpr.String())
+}
+
+// MustParsePhoneNumber is like ParsePhoneNumber but panics if the phone
+// number cannot be parsed.
+func MustParsePhoneNumber(s string) PhoneNumber {
+ n, err := ParsePhoneNumber(s)
+ if err != nil {
+ panic(fmt.Sprintf("lulu: ParsePhoneNumber(%q): %v", s, err))
+ }
+ return n
+}
+
+func (n *PhoneNumber) UnmarshalText(text []byte) error {
+ pn, err := ParsePhoneNumber(string(text))
+ if err != nil {
+ return err
+ }
+ *n = pn
+ return nil
+}