phone.go 968 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package model
  2. import (
  3. "fmt"
  4. "github.com/gshopify/service-wrapper/model"
  5. "github.com/mitchellh/mapstructure"
  6. "github.com/nyaruka/phonenumbers"
  7. )
  8. type Phone struct {
  9. number *phonenumbers.PhoneNumber
  10. Verified bool `mapstructure:"phone_verified"`
  11. PhoneNumber string `mapstructure:"phone_number"`
  12. PhoneRegion string `mapstructure:"phone_region"`
  13. }
  14. func ParsePhoneNumber(m map[string]any) (*Phone, error) {
  15. var (
  16. p = Phone{}
  17. err error
  18. )
  19. if err := mapstructure.Decode(m, &p); err != nil {
  20. return nil, err
  21. }
  22. if p.PhoneNumber == "" || p.PhoneRegion == "" {
  23. return nil, nil
  24. }
  25. region := model.CountryCode(p.PhoneRegion)
  26. if !region.IsValid() {
  27. return nil, fmt.Errorf("illegal country code: `%s`", p.PhoneRegion)
  28. }
  29. p.number, err = phonenumbers.Parse(p.PhoneNumber, p.PhoneRegion)
  30. if err != nil {
  31. return nil, err
  32. }
  33. return &p, nil
  34. }
  35. func (p *Phone) String() string {
  36. return phonenumbers.Format(p.number, phonenumbers.INTERNATIONAL)
  37. }