niki/vendor/github.com/brianvoe/gofakeit/v7/person.go

783 lines
22 KiB
Go

package gofakeit
import (
"math"
"strconv"
"strings"
)
// PersonInfo is a struct of person information
type PersonInfo struct {
FirstName string `json:"first_name" xml:"first_name"`
LastName string `json:"last_name" xml:"last_name"`
Gender string `json:"gender" xml:"gender"`
Age int `json:"age" xml:"age"`
SSN string `json:"ssn" xml:"ssn"`
Hobby string `json:"hobby" xml:"hobby"`
Job *JobInfo `json:"job" xml:"job"`
Address *AddressInfo `json:"address" xml:"address"`
Contact *ContactInfo `json:"contact" xml:"contact"`
CreditCard *CreditCardInfo `json:"credit_card" xml:"credit_card"`
}
// Person will generate a struct with person information
func Person() *PersonInfo { return person(GlobalFaker) }
// Person will generate a struct with person information
func (f *Faker) Person() *PersonInfo { return person(f) }
func person(f *Faker) *PersonInfo {
return &PersonInfo{
FirstName: firstName(f),
LastName: lastName(f),
Gender: gender(f),
Age: age(f),
SSN: ssn(f),
Hobby: hobby(f),
Job: job(f),
Address: address(f),
Contact: contact(f),
CreditCard: creditCard(f),
}
}
// Name will generate a random First and Last Name
func Name() string { return name(GlobalFaker) }
// Name will generate a random First and Last Name
func (f *Faker) Name() string { return name(f) }
func name(f *Faker) string {
return getRandValue(f, []string{"person", "first"}) + " " + getRandValue(f, []string{"person", "last"})
}
// FirstName will generate a random first name
func FirstName() string { return firstName(GlobalFaker) }
// FirstName will generate a random first name
func (f *Faker) FirstName() string { return firstName(f) }
func firstName(f *Faker) string { return getRandValue(f, []string{"person", "first"}) }
// MiddleName will generate a random middle name
func MiddleName() string { return middleName(GlobalFaker) }
// MiddleName will generate a random middle name
func (f *Faker) MiddleName() string { return middleName(f) }
func middleName(f *Faker) string { return getRandValue(f, []string{"person", "middle"}) }
// LastName will generate a random last name
func LastName() string { return lastName(GlobalFaker) }
// LastName will generate a random last name
func (f *Faker) LastName() string { return lastName(f) }
func lastName(f *Faker) string { return getRandValue(f, []string{"person", "last"}) }
// NamePrefix will generate a random name prefix
func NamePrefix() string { return namePrefix(GlobalFaker) }
// NamePrefix will generate a random name prefix
func (f *Faker) NamePrefix() string { return namePrefix(f) }
func namePrefix(f *Faker) string { return getRandValue(f, []string{"person", "prefix"}) }
// NameSuffix will generate a random name suffix
func NameSuffix() string { return nameSuffix(GlobalFaker) }
// NameSuffix will generate a random name suffix
func (f *Faker) NameSuffix() string { return nameSuffix(f) }
func nameSuffix(f *Faker) string { return getRandValue(f, []string{"person", "suffix"}) }
// Age will generate a random age between 0 and 100
func Age() int { return age(GlobalFaker) }
// Age will generate a random age between 0 and 100
func (f *Faker) Age() int { return age(f) }
func age(f *Faker) int { return randIntRange(f, 0, 100) }
// Ethnicity will generate a random ethnicity string
func Ethnicity() string { return ethnicity(GlobalFaker) }
// Ethnicity will generate a random ethnicity string
func (f *Faker) Ethnicity() string { return ethnicity(f) }
func ethnicity(f *Faker) string { return getRandValue(f, []string{"person", "ethnicity"}) }
// SSN will generate a random Social Security Number
func SSN() string { return ssn(GlobalFaker) }
// SSN will generate a random Social Security Number
func (f *Faker) SSN() string { return ssn(f) }
func ssn(f *Faker) string { return strconv.Itoa(randIntRange(f, 100000000, 999999999)) }
// EIN will generate a random Employer Identification Number
func EIN() string { return ein(GlobalFaker) }
// EIN will generate a random Employer Identification Number
func (f *Faker) EIN() string { return ein(f) }
func ein(f *Faker) string {
// EIN format: XX-XXXXXXX (2 digits, dash, 7 digits)
// First two digits have specific valid prefixes
prefixes := []string{"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99"}
prefix := prefixes[f.IntN(len(prefixes))]
// Generate 7 random digits
sevenDigits := ""
for i := 0; i < 7; i++ {
sevenDigits += string(rune('0' + f.IntN(10)))
}
return prefix + "-" + sevenDigits
}
// Gender will generate a random gender string
func Gender() string { return gender(GlobalFaker) }
// Gender will generate a random gender string
func (f *Faker) Gender() string { return gender(f) }
func gender(f *Faker) string {
if boolFunc(f) {
return "male"
}
return "female"
}
// Hobby will generate a random hobby string
func Hobby() string { return hobby(GlobalFaker) }
// Hobby will generate a random hobby string
func (f *Faker) Hobby() string { return hobby(f) }
func hobby(f *Faker) string { return getRandValue(f, []string{"person", "hobby"}) }
// SocialMedia will generate a random social media string
func SocialMedia() string { return socialMedia(GlobalFaker) }
// SocialMedia will generate a random social media string
func (f *Faker) SocialMedia() string { return socialMedia(f) }
func socialMedia(f *Faker) string {
template := getRandValue(f, []string{"person", "social_media"})
social, err := generate(f, template)
if err != nil {
return template // fallback to raw template if generation fails
}
return social
}
// Bio will generate a random biography using mad libs style templates
func Bio() string {
return bio(GlobalFaker)
}
// Bio will generate a random biography using mad libs style templates
func (f *Faker) Bio() string {
return bio(f)
}
func bio(f *Faker) string {
template := getRandValue(f, []string{"person", "bio"})
// Use generate function to process the template with all available lookups
bio, err := generate(f, template)
if err != nil {
return template // fallback to raw template if generation fails
}
return bio
}
// ContactInfo struct full of contact info
type ContactInfo struct {
Phone string `json:"phone" xml:"phone"`
Email string `json:"email" xml:"email"`
}
// Contact will generate a struct with information randomly populated contact information
func Contact() *ContactInfo { return contact(GlobalFaker) }
// Contact will generate a struct with information randomly populated contact information
func (f *Faker) Contact() *ContactInfo { return contact(f) }
func contact(f *Faker) *ContactInfo {
return &ContactInfo{
Phone: phone(f),
Email: email(f),
}
}
// Phone will generate a random phone number string
func Phone() string { return phone(GlobalFaker) }
// Phone will generate a random phone number string
func (f *Faker) Phone() string { return phone(f) }
func phone(f *Faker) string { return replaceWithNumbers(f, "##########") }
// PhoneFormatted will generate a random phone number string
func PhoneFormatted() string { return phoneFormatted(GlobalFaker) }
// PhoneFormatted will generate a random phone number string
func (f *Faker) PhoneFormatted() string { return phoneFormatted(f) }
func phoneFormatted(f *Faker) string {
return replaceWithNumbers(f, getRandValue(f, []string{"person", "phone"}))
}
// Email will generate a random email string
func Email() string { return email(GlobalFaker) }
// Email will generate a random email string
func (f *Faker) Email() string { return email(f) }
func email(f *Faker) string {
email := getRandValue(f, []string{"person", "first"}) + getRandValue(f, []string{"person", "last"})
email += "@"
email += getRandValue(f, []string{"person", "last"}) + "." + getRandValue(f, []string{"internet", "domain_suffix"})
return strings.ToLower(email)
}
// Teams takes in an array of people and team names and randomly places the people into teams as evenly as possible
func Teams(peopleArray []string, teamsArray []string) map[string][]string {
return teams(GlobalFaker, peopleArray, teamsArray)
}
// Teams takes in an array of people and team names and randomly places the people into teams as evenly as possible
func (f *Faker) Teams(peopleArray []string, teamsArray []string) map[string][]string {
return teams(f, peopleArray, teamsArray)
}
func teams(f *Faker, people []string, teams []string) map[string][]string {
// Shuffle the people if more than 1
if len(people) > 1 {
shuffleStrings(f, people)
}
peopleIndex := 0
teamsOutput := make(map[string][]string)
numPer := math.Ceil(float64(len(people)) / float64(len(teams)))
for _, team := range teams {
teamsOutput[team] = []string{}
for i := 0.00; i < numPer; i++ {
if peopleIndex < len(people) {
teamsOutput[team] = append(teamsOutput[team], people[peopleIndex])
peopleIndex++
}
}
}
return teamsOutput
}
func addPersonLookup() {
AddFuncLookup("person", Info{
Display: "Person",
Category: "person",
Description: "Personal data, like name and contact details, used for identification and communication",
Example: `{
"first_name": "Markus",
"last_name": "Moen",
"gender": "male",
"age": 30,
"ssn": "275413589",
"image": "https://picsum.photos/208/500",
"hobby": "Lacrosse",
"job": {
"company": "Intermap Technologies",
"title": "Developer",
"descriptor": "Direct",
"level": "Paradigm"
},
"address": {
"address": "369 North Cornerbury, Miami, North Dakota 24259",
"street": "369 North Cornerbury",
"city": "Miami",
"state": "North Dakota",
"zip": "24259",
"country": "Ghana",
"latitude": -6.662595,
"longitude": 23.921575
},
"contact": {
"phone": "3023202027",
"email": "lamarkoelpin@heaney.biz"
},
"credit_card": {
"type": "Maestro",
"number": "39800889982276",
"exp": "01/29",
"cvv": "932"
}
}`,
Output: "map[string]any",
ContentType: "application/json",
Aliases: []string{
"person record",
"identity profile",
"user profile",
"personal info",
"individual data",
},
Keywords: []string{
"profile", "identity", "individual",
"user", "account", "record", "contact",
"name", "details", "attributes", "information",
"bio", "demographics", "personal", "data",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return person(f), nil
},
})
// full name
AddFuncLookup("name", Info{
Display: "Name",
Category: "person",
Description: "The given and family name of an individual",
Example: "Markus Moen",
Output: "string",
Aliases: []string{
"full name",
"person name",
"complete name",
"name string",
"display name",
},
Keywords: []string{
"fullname", "given", "family",
"first", "last", "forename", "surname",
"display", "legal",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return name(f), nil },
})
// name prefix (honorific)
AddFuncLookup("nameprefix", Info{
Display: "Name Prefix",
Category: "person",
Description: "A title or honorific added before a person's name",
Example: "Mr.",
Output: "string",
Aliases: []string{
"name prefix",
"honorific",
"title prefix",
"courtesy title",
"pre-nominal",
},
Keywords: []string{
"prefix", "title", "mr", "ms", "mrs",
"dr", "prof", "sir", "madam", "rev", "fr",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return namePrefix(f), nil },
})
// name suffix (generational/professional)
AddFuncLookup("namesuffix", Info{
Display: "Name Suffix",
Category: "person",
Description: "A title or designation added after a person's name",
Example: "Jr.",
Output: "string",
Aliases: []string{
"name suffix",
"post nominal",
"suffix designation",
"generational suffix",
"professional suffix",
},
Keywords: []string{
"suffix", "jr", "sr", "iii", "iv",
"esq", "phd", "md", "mba", "cpa",
"designation",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return nameSuffix(f), nil },
})
// first name
AddFuncLookup("firstname", Info{
Display: "First Name",
Category: "person",
Description: "The name given to a person at birth",
Example: "Markus",
Output: "string",
Aliases: []string{
"first name",
"given name",
"forename",
"personal name",
"given label",
},
Keywords: []string{
"first", "given", "name",
"preferred", "callname", "initial",
"personal",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return firstName(f), nil },
})
// middle name
AddFuncLookup("middlename", Info{
Display: "Middle Name",
Category: "person",
Description: "Name between a person's first name and last name",
Example: "Belinda",
Output: "string",
Aliases: []string{
"middle name",
"second name",
"additional name",
"secondary name",
"middle initial label",
},
Keywords: []string{
"middle", "second", "additional", "secondary",
"name", "initial", "intermediate", "optional",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return middleName(f), nil },
})
// last name
AddFuncLookup("lastname", Info{
Display: "Last Name",
Category: "person",
Description: "The family name or surname of an individual",
Example: "Daniel",
Output: "string",
Aliases: []string{
"last name",
"family name",
"surname",
"patronymic",
"family designation",
},
Keywords: []string{
"last", "family", "name",
"lineage", "heritage", "ancestry", "clan",
"tribe",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return lastName(f), nil },
})
// gender
AddFuncLookup("gender", Info{
Display: "Gender",
Category: "person",
Description: "Classification that identifies gender",
Example: "male",
Output: "string",
Aliases: []string{
"gender identity",
"gender label",
"sex category",
"gender marker",
"presentation",
},
Keywords: []string{
"male", "female", "nonbinary",
"identity", "label", "category", "sex",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return gender(f), nil },
})
// age
AddFuncLookup("age", Info{
Display: "Age",
Category: "person",
Description: "The number of years a person has lived",
Example: "40",
Output: "int",
Aliases: []string{
"age of person", "person age", "age of individual", "years old", "years of age",
},
Keywords: []string{
"years", "old", "birthday", "birthdate", "birth-date",
"lifespan", "maturity", "elderly", "young", "adult", "teenager", "child",
"senior", "juvenile", "minor", "majority", "minority", "generation",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return age(f), nil },
})
// ethnicity
AddFuncLookup("ethnicity", Info{
Display: "Ethnicity",
Category: "person",
Description: "Classification that identifies a person's cultural or ethnic background",
Example: "German",
Output: "string",
Aliases: []string{
"ethnic background",
"ethnic identity",
"cultural background",
"cultural heritage",
"ethnic origin",
},
Keywords: []string{
"ethnic", "heritage", "ancestry",
"origin", "identity", "cultural", "nationality",
"background", "descent", "lineage",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return ethnicity(f), nil },
})
// ssn
AddFuncLookup("ssn", Info{
Display: "SSN",
Category: "person",
Description: "Unique nine-digit identifier used for government and financial purposes in the United States",
Example: "296446360",
Output: "string",
Aliases: []string{
"social security number",
"ssn number",
"us ssn",
"tax id us",
"federal id",
},
Keywords: []string{
"social", "security", "number",
"us", "tax", "irs", "employment",
"benefits", "identification",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return ssn(f), nil },
})
AddFuncLookup("ein", Info{
Display: "EIN",
Category: "person",
Description: "Nine-digit Employer Identification Number used by businesses for tax purposes",
Example: "12-3456789",
Output: "string",
Aliases: []string{
"employer id",
"tax id",
"business tax id",
"federal tax id",
"irs number",
},
Keywords: []string{
"employer", "identification", "tax", "business", "federal", "irs", "number", "id",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return ein(f), nil },
})
// hobby
AddFuncLookup("hobby", Info{
Display: "Hobby",
Category: "person",
Description: "An activity pursued for leisure and pleasure",
Example: "Swimming",
Output: "string",
Aliases: []string{
"pastime",
"leisure activity",
"recreational activity",
"interest",
"free-time pursuit",
},
Keywords: []string{
"leisure", "recreation",
"activity", "sport", "craft",
"game", "collection",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return hobby(f), nil },
})
AddFuncLookup("socialmedia", Info{
Display: "Social Media",
Category: "person",
Description: "Random social media string",
Example: "https://twitter.com/ImpossibleTrousers",
Output: "string",
Aliases: []string{
"social media",
"social link",
"social url",
"social handle",
"social username",
"social profile",
"profile link",
"profile url",
"profile handle",
"account link",
"account url",
"account handle",
"username handle",
"screen name",
// platform-intent phrases (useful for fuzzy scoring)
"twitter link",
"x link",
"instagram link",
"linkedin url",
"github url",
"tiktok handle",
"facebook profile",
},
Keywords: []string{
"social", "media", "profile", "account", "handle", "username",
"screenname", "link", "url",
"twitter", "x", "instagram", "linkedin", "github",
"tiktok", "facebook", "dribbble", "behance",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return socialMedia(f), nil },
})
AddFuncLookup("bio", Info{
Display: "Biography",
Category: "person",
Description: "Random biography",
Example: "Born in New York, John grew up to become a Software Engineer who codes applications.",
Output: "string",
Aliases: []string{
"bio",
"short bio",
"mini bio",
"one line bio",
"profile bio",
"user bio",
"author bio",
"about",
"about me",
"profile summary",
"personal summary",
"blurb",
"elevator pitch",
},
Keywords: []string{
"profile", "summary", "tagline", "intro",
"overview", "description", "story", "background",
"career", "job", "role", "hobby", "personal", "person",
"one-liner", "author", "user",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return f.Bio(), nil },
})
// email
AddFuncLookup("email", Info{
Display: "Email",
Category: "person",
Description: "Electronic mail address",
Example: "markusmoen@pagac.net",
Output: "string",
Aliases: []string{
"email address",
"mail address",
"contact email",
"user email",
"electronic mailbox",
},
Keywords: []string{
"address", "mail", "inbox",
"account", "contact", "sender", "recipient",
"domain", "username",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return email(f), nil },
})
// phone (raw digits)
AddFuncLookup("phone", Info{
Display: "Phone",
Category: "person",
Description: "Numerical sequence used to contact individuals via telephone or mobile devices",
Example: "6136459948",
Output: "string",
Aliases: []string{
"phone number",
"telephone number",
"mobile number",
"contact number",
"voice number",
},
Keywords: []string{
"number", "telephone", "mobile",
"contact", "dial", "cell", "landline",
"e164", "voice",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return phone(f), nil },
})
// phone formatted (readable)
AddFuncLookup("phoneformatted", Info{
Display: "Phone Formatted",
Category: "person",
Description: "Formatted phone number of a person",
Example: "136-459-9489",
Output: "string",
Aliases: []string{
"formatted phone",
"pretty phone",
"display phone",
"readable phone",
"formatted telephone",
},
Keywords: []string{
"phone", "formatted", "format", "pattern",
"dashes", "parentheses", "spaces", "separators",
"telephone", "contact",
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return phoneFormatted(f), nil },
})
AddFuncLookup("teams", Info{
Display: "Teams",
Category: "person",
Description: "Randomly split people into teams",
Example: `{
"Team 1": [
"Justin",
"Connor",
"Jeff"
],
"Team 2": [
"Sharon",
"Fabian",
"Billy"
],
"Team 3": [
"Steve",
"Robert"
]
}`,
Output: "map[string][]string",
ContentType: "application/json",
Aliases: []string{
"people grouping",
"team assignment",
"random partition",
"group allocator",
"roster builder",
},
Keywords: []string{
"randomly", "person", "into",
"distribution", "allocation", "roster", "squad",
},
Params: []Param{
{Field: "people", Display: "Strings", Type: "[]string", Description: "Array of people"},
{Field: "teams", Display: "Strings", Type: "[]string", Description: "Array of teams"},
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
people, err := info.GetStringArray(m, "people")
if err != nil {
return nil, err
}
teamsArray, err := info.GetStringArray(m, "teams")
if err != nil {
return nil, err
}
return teams(f, people, teamsArray), nil
},
})
}