1package faker
 2
 3import (
 4	"fmt"
 5	"reflect"
 6	"strings"
 7
 8	"github.com/go-faker/faker/v4/pkg/options"
 9	"github.com/go-faker/faker/v4/pkg/slice"
10)
11
12// GetPhoner serves as a constructor for Phoner interface
13func GetPhoner() Phoner {
14	phone := &Phone{}
15	return phone
16}
17
18// Phoner serves overall tele-phonic contact generator
19type Phoner interface {
20	PhoneNumber(v reflect.Value) (interface{}, error)
21	TollFreePhoneNumber(v reflect.Value) (interface{}, error)
22	E164PhoneNumber(v reflect.Value) (interface{}, error)
23}
24
25// Phone struct
26type Phone struct {
27}
28
29func (p Phone) phonenumber() string {
30	randInt, _ := RandomInt(1, 10)
31	str := strings.Join(slice.IntToString(randInt), "")
32	return fmt.Sprintf("%s-%s-%s", str[:3], str[3:6], str[6:10])
33}
34
35// PhoneNumber generates phone numbers of type: "201-886-0269"
36func (p Phone) PhoneNumber(v reflect.Value) (interface{}, error) {
37	return p.phonenumber(), nil
38}
39
40// Phonenumber get fake phone number
41func Phonenumber(opts ...options.OptionFunc) string {
42	return singleFakeData(PhoneNumber, func() interface{} {
43		p := Phone{}
44		return p.phonenumber()
45	}, opts...).(string)
46}
47
48func (p Phone) tollfreephonenumber() string {
49	out := ""
50	boxDigitsStart := []string{"777", "888"}
51
52	ints, _ := RandomInt(1, 9)
53	for index, v := range slice.IntToString(ints) {
54		if index == 3 {
55			out += "-"
56		}
57		out += v
58	}
59	return fmt.Sprintf("(%s) %s", boxDigitsStart[rand.Intn(len(boxDigitsStart))], out)
60}
61
62// TollFreePhoneNumber generates phone numbers of type: "(888) 937-7238"
63func (p Phone) TollFreePhoneNumber(v reflect.Value) (interface{}, error) {
64	return p.tollfreephonenumber(), nil
65}
66
67// TollFreePhoneNumber get fake TollFreePhoneNumber
68func TollFreePhoneNumber(opts ...options.OptionFunc) string {
69	return singleFakeData(TollFreeNumber, func() interface{} {
70		p := Phone{}
71		return p.tollfreephonenumber()
72	}, opts...).(string)
73}
74
75func (p Phone) e164PhoneNumber() string {
76	out := ""
77	boxDigitsStart := []string{"7", "8"}
78	ints, _ := RandomInt(1, 10)
79
80	for _, v := range slice.IntToString(ints) {
81		out += v
82	}
83	return fmt.Sprintf("+%s%s", boxDigitsStart[rand.Intn(len(boxDigitsStart))], strings.Join(slice.IntToString(ints), ""))
84}
85
86// E164PhoneNumber generates phone numbers of type: "+27113456789"
87func (p Phone) E164PhoneNumber(v reflect.Value) (interface{}, error) {
88	return p.e164PhoneNumber(), nil
89}
90
91// E164PhoneNumber get fake E164PhoneNumber
92func E164PhoneNumber(opts ...options.OptionFunc) string {
93	return singleFakeData(E164PhoneNumberTag, func() interface{} {
94		p := Phone{}
95		return p.e164PhoneNumber()
96	}, opts...).(string)
97}