package gofakeit import ( "math" "strconv" "strings" "time" "github.com/brianvoe/gofakeit/v7/data" ) // CurrencyInfo is a struct of currency information type CurrencyInfo struct { Short string `json:"short" xml:"short"` Long string `json:"long" xml:"long"` } // Currency will generate a struct with random currency information func Currency() *CurrencyInfo { return currency(GlobalFaker) } // Currency will generate a struct with random currency information func (f *Faker) Currency() *CurrencyInfo { return currency(f) } func currency(f *Faker) *CurrencyInfo { index := f.IntN(len(data.Data["currency"]["short"])) return &CurrencyInfo{ Short: data.Data["currency"]["short"][index], Long: data.Data["currency"]["long"][index], } } // CurrencyShort will generate a random short currency value func CurrencyShort() string { return currencyShort(GlobalFaker) } // CurrencyShort will generate a random short currency value func (f *Faker) CurrencyShort() string { return currencyShort(f) } func currencyShort(f *Faker) string { return getRandValue(f, []string{"currency", "short"}) } // CurrencyLong will generate a random long currency name func CurrencyLong() string { return currencyLong(GlobalFaker) } // CurrencyLong will generate a random long currency name func (f *Faker) CurrencyLong() string { return currencyLong(f) } func currencyLong(f *Faker) string { return getRandValue(f, []string{"currency", "long"}) } // Price will take in a min and max value and return a formatted price func Price(min, max float64) float64 { return price(GlobalFaker, min, max) } // Price will take in a min and max value and return a formatted price func (f *Faker) Price(min, max float64) float64 { return price(f, min, max) } func price(f *Faker, min, max float64) float64 { return math.Floor(float64Range(f, min, max)*100) / 100 } // CreditCardInfo is a struct containing credit variables type CreditCardInfo struct { Type string `json:"type" xml:"type"` Number string `json:"number" xml:"number"` Exp string `json:"exp" xml:"exp"` Cvv string `json:"cvv" xml:"cvv"` } // CreditCard will generate a struct full of credit card information func CreditCard() *CreditCardInfo { return creditCard(GlobalFaker) } // CreditCard will generate a struct full of credit card information func (f *Faker) CreditCard() *CreditCardInfo { return creditCard(f) } func creditCard(f *Faker) *CreditCardInfo { ccType := randomString(f, data.CreditCardTypes) ccv, _ := generate(f, strings.Repeat("#", int(data.CreditCards[randomString(f, data.CreditCardTypes)].Code.Size))) return &CreditCardInfo{ Type: data.CreditCards[randomString(f, data.CreditCardTypes)].Display, Number: creditCardNumber(f, &CreditCardOptions{Types: []string{ccType}}), Exp: creditCardExp(f), Cvv: ccv, } } // CreditCardType will generate a random credit card type string func CreditCardType() string { return creditCardType(GlobalFaker) } // CreditCardType will generate a random credit card type string func (f *Faker) CreditCardType() string { return creditCardType(f) } func creditCardType(f *Faker) string { return data.CreditCards[randomString(f, data.CreditCardTypes)].Display } // CreditCardOptions is the options for credit card number type CreditCardOptions struct { Types []string `json:"types"` Bins []string `json:"bins"` // optional parameter of prepended numbers Gaps bool `json:"gaps"` } // CreditCardNumber will generate a random luhn credit card number func CreditCardNumber(cco *CreditCardOptions) string { return creditCardNumber(GlobalFaker, cco) } // CreditCardNumber will generate a random luhn credit card number func (f *Faker) CreditCardNumber(cco *CreditCardOptions) string { return creditCardNumber(f, cco) } func creditCardNumber(f *Faker, cco *CreditCardOptions) string { if cco == nil { cco = &CreditCardOptions{} } if len(cco.Types) == 0 { cco.Types = data.CreditCardTypes } ccType := randomString(f, cco.Types) // Get Card info var cardInfo data.CreditCardInfo if info, ok := data.CreditCards[ccType]; ok { cardInfo = info } else { ccType = randomString(f, data.CreditCardTypes) cardInfo = data.CreditCards[ccType] } // Get length and pattern length := randomUint(f, cardInfo.Lengths) numStr := "" if len(cco.Bins) >= 1 { numStr = randomString(f, cco.Bins) } else { numStr = strconv.FormatUint(uint64(randomUint(f, cardInfo.Patterns)), 10) } numStr += strings.Repeat("#", int(length)-len(numStr)) numStr = numerify(f, numStr) ui, _ := strconv.ParseUint(numStr, 10, 64) // Loop through until its a valid luhn for { valid := isLuhn(strconv.FormatUint(ui, 10)) if valid { break } ui++ } numStr = strconv.FormatUint(ui, 10) // Add gaps to number if cco.Gaps { for i, spot := range cardInfo.Gaps { numStr = numStr[:(int(spot)+i)] + " " + numStr[(int(spot)+i):] } } return numStr } // CreditCardExp will generate a random credit card expiration date string // Exp date will always be a future date func CreditCardExp() string { return creditCardExp(GlobalFaker) } // CreditCardExp will generate a random credit card expiration date string // Exp date will always be a future date func (f *Faker) CreditCardExp() string { return creditCardExp(f) } func creditCardExp(f *Faker) string { month := strconv.Itoa(randIntRange(f, 1, 12)) if len(month) == 1 { month = "0" + month } var currentYear = time.Now().Year() - 2000 return month + "/" + strconv.Itoa(randIntRange(f, currentYear+1, currentYear+10)) } // CreditCardCvv will generate a random CVV number // Its a string because you could have 017 as an exp date func CreditCardCvv() string { return creditCardCvv(GlobalFaker) } // CreditCardCvv will generate a random CVV number // Its a string because you could have 017 as an exp date func (f *Faker) CreditCardCvv() string { return creditCardCvv(f) } func creditCardCvv(f *Faker) string { return numerify(f, "###") } // isLuhn check is used for checking if credit card is a valid luhn card func isLuhn(s string) bool { var t = [...]int{0, 2, 4, 6, 8, 1, 3, 5, 7, 9} odd := len(s) & 1 var sum int for i, c := range s { if c < '0' || c > '9' { return false } if i&1 == odd { sum += t[c-'0'] } else { sum += int(c - '0') } } return sum%10 == 0 } // AchRouting will generate a 9 digit routing number func AchRouting() string { return achRouting(GlobalFaker) } // AchRouting will generate a 9 digit routing number func (f *Faker) AchRouting() string { return achRouting(f) } func achRouting(f *Faker) string { return numerify(f, "#########") } // AchAccount will generate a 12 digit account number func AchAccount() string { return achAccount(GlobalFaker) } // AchAccount will generate a 12 digit account number func (f *Faker) AchAccount() string { return achAccount(f) } func achAccount(f *Faker) string { return numerify(f, "############") } // BitcoinAddress will generate a random bitcoin address consisting of numbers, upper and lower characters func BitcoinAddress() string { return bitcoinAddress(GlobalFaker) } // BitcoinAddress will generate a random bitcoin address consisting of numbers, upper and lower characters func (f *Faker) BitcoinAddress() string { return bitcoinAddress(f) } func bitcoinAddress(f *Faker) string { return randomString(f, []string{"1", "3"}) + password(f, true, true, true, false, false, number(f, 25, 34)) } // BitcoinPrivateKey will generate a random bitcoin private key base58 consisting of numbers, upper and lower characters func BitcoinPrivateKey() string { return bitcoinPrivateKey(GlobalFaker) } // BitcoinPrivateKey will generate a random bitcoin private key base58 consisting of numbers, upper and lower characters func (f *Faker) BitcoinPrivateKey() string { return bitcoinPrivateKey(f) } func bitcoinPrivateKey(f *Faker) string { var b strings.Builder for i := 0; i < 49; i++ { b.WriteString(randCharacter(f, base58)) } return "5" + randomString(f, []string{"H", "J", "K"}) + b.String() } func BankName() string { return bankName(GlobalFaker) } func (f *Faker) BankName() string { return bankName(f) } func bankName(f *Faker) string { return getRandValue(f, []string{"bank", "name"}) } func BankType() string { return bankType(GlobalFaker) } func (f *Faker) BankType() string { return bankType(f) } func bankType(f *Faker) string { return getRandValue(f, []string{"bank", "type"}) } func addPaymentLookup() { AddFuncLookup("currency", Info{ Display: "Currency", Category: "payment", Description: "Medium of exchange, often in the form of money, used for trade and transactions", Example: `{ "short": "IQD", "long": "Iraq Dinar" }`, Output: "map[string]string", ContentType: "application/json", Aliases: []string{ "currency unit", "currency code", "money type", "exchange currency", "monetary unit", "legal tender", "fiat money", }, Keywords: []string{ "money", "exchange", "fiat", "unit", "code", "iso", "usd", "eur", "gbp", "jpy", "cny", "trade", "transaction", "market", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return currency(f), nil }, }) AddFuncLookup("currencyshort", Info{ Display: "Currency Short", Category: "payment", Description: "Short 3-letter ISO code used to represent a specific currency", Example: "USD", Output: "string", Aliases: []string{ "iso alpha-3", "currency ticker", "alpha-3 code", "currency shorthand", "iso-4217 code", }, Keywords: []string{ "currency", "short", "iso", "code", "alpha3", "usd", "eur", "gbp", "jpy", "cad", "aud", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return currencyShort(f), nil }, }) AddFuncLookup("currencylong", Info{ Display: "Currency Long", Category: "payment", Description: "Complete name of a specific currency used in financial transactions", Example: "United States Dollar", Output: "string", Aliases: []string{ "currency name", "full currency", "long form name", "official currency", "monetary name", }, Keywords: []string{ "currency", "name", "long", "full", "official", "dollar", "euro", "pound", "yen", "franc", "peso", "rupee", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return currencyLong(f), nil }, }) AddFuncLookup("price", Info{ Display: "Price", Category: "payment", Description: "The amount of money assigned to a product, service, or asset in a transaction", Example: "92.26", Output: "float64", Aliases: []string{ "amount", "cost", "value", "fee", "charge", "rate", "unit price", }, Keywords: []string{ "payment", "transaction", "retail", "wholesale", "market", "asset", "listing", "quote", "valuation", }, Params: []Param{ {Field: "min", Display: "Min", Type: "float", Default: "0", Description: "Minimum price value"}, {Field: "max", Display: "Max", Type: "float", Default: "1000", Description: "Maximum price value"}, }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { min, err := info.GetFloat64(m, "min") if err != nil { return nil, err } max, err := info.GetFloat64(m, "max") if err != nil { return nil, err } return price(f, min, max), nil }, }) AddFuncLookup("creditcard", Info{ Display: "Credit Card", Category: "payment", Description: "Card allowing users to make purchases on credit, with payment due at a later date", Example: `{ "type": "Visa", "number": "4111111111111111", "exp": "02/27", "cvv": "123" }`, Output: "map[string]any", ContentType: "application/json", Aliases: []string{ "credit card", "payment card", "charge card", "credit instrument", "card account", "plastic card", }, Keywords: []string{ "credit", "card", "payment", "debt", "visa", "mastercard", "amex", "discover", "unionpay", "maestro", "jcb", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return creditCard(f), nil }, }) AddFuncLookup("creditcardtype", Info{ Display: "Credit Card Type", Category: "payment", Description: "Classification of credit cards based on the issuing company", Example: "Visa", Output: "string", Aliases: []string{ "credit card type", "issuer brand", "card network", "scheme name", "card family", "issuer type", }, Keywords: []string{ "credit", "card", "type", "issuer", "brand", "network", "visa", "mastercard", "amex", "discover", "unionpay", "maestro", "jcb", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return creditCardType(f), nil }, }) AddFuncLookup("creditcardnumber", Info{ Display: "Credit Card Number", Category: "payment", Description: "Unique number on a credit card used for electronic payments", Example: "4111111111111111", Output: "string", Aliases: []string{ "credit card", "credit card number", "card number", "cc number", "primary account number", "pan value", "payment number", }, Keywords: []string{ "credit", "card", "number", "identifier", "luhn", "validation", "checksum", "bin", "tokenize", "masking", "digits", }, Params: []Param{ { Field: "types", Display: "Types", Type: "[]string", Default: "all", Options: []string{"visa", "mastercard", "american-express", "diners-club", "discover", "jcb", "unionpay", "maestro", "elo", "hiper", "hipercard"}, Description: "A select number of types you want to use when generating a credit card number", }, {Field: "bins", Display: "Bins", Type: "[]string", Optional: true, Description: "Optional list of prepended bin numbers to pick from"}, {Field: "gaps", Display: "Gaps", Type: "bool", Default: "false", Optional: true, Description: "Whether or not to have gaps in number"}, }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { types, err := info.GetStringArray(m, "types") if err != nil { return nil, err } if len(types) == 1 && types[0] == "all" { types = []string{} } bins, _ := info.GetStringArray(m, "bins") gaps, _ := info.GetBool(m, "gaps") options := CreditCardOptions{Types: types, Gaps: gaps} if len(bins) >= 1 { options.Bins = bins } return creditCardNumber(f, &options), nil }, }) AddFuncLookup("creditcardexp", Info{ Display: "Credit Card Exp", Category: "payment", Description: "Expiration date of a credit card", Example: "01/27", Output: "string", Aliases: []string{ "credit card exp", "credit card expiration", "expiry date", "expiration date", "exp date", "valid thru", "card expiry", }, Keywords: []string{ "credit", "card", "exp", "expiry", "expiration", "month", "year", "validity", "future", "expired", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return creditCardExp(f), nil }, }) AddFuncLookup("creditcardcvv", Info{ Display: "Credit Card CVV", Category: "payment", Description: "Three or four-digit security code on a credit card", Example: "513", Output: "string", Aliases: []string{ "credit card cvv", "cvv", "cvc", "cid", "security number", "auth digits", "card check value", "security code", }, Keywords: []string{ "security", "code", "verification", "authentication", "fraud", "protection", "online", "payment", "transaction", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return creditCardCvv(f), nil }, }) AddFuncLookup("achrouting", Info{ Display: "ACH Routing Number", Category: "payment", Description: "Nine-digit code used in the U.S. for identifying a bank in ACH transactions", Example: "513715684", Output: "string", Aliases: []string{ "routing number", "aba number", "routing transit number", "rtn code", "bank routing id", }, Keywords: []string{ "ach", "routing", "aba", "us", "bank", "federal", "reserve", "clearinghouse", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return achRouting(f), nil }, }) AddFuncLookup("achaccount", Info{ Display: "ACH Account Number", Category: "payment", Description: "Bank account number used for Automated Clearing House transactions", Example: "491527954328", Output: "string", Aliases: []string{ "account number", "ach account", "bank account", "checking account", "savings account", "account identifier", }, Keywords: []string{ "ach", "account", "banking", "checking", "savings", "finance", "electronic", "transfer", "payment", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return achAccount(f), nil }, }) AddFuncLookup("bitcoinaddress", Info{ Display: "Bitcoin Address", Category: "payment", Description: "Cryptographic identifier used to send and receive Bitcoin", Example: "1BoatSLRHtKNngkdXEeobR76b53LETtpyT", Output: "string", Aliases: []string{ "btc address", "bitcoin wallet", "crypto address", "public address", "payment address", }, Keywords: []string{ "bitcoin", "btc", "wallet", "blockchain", "public", "key", "hash", "base58", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return bitcoinAddress(f), nil }, }) AddFuncLookup("bitcoinprivatekey", Info{ Display: "Bitcoin Private Key", Category: "payment", Description: "Secret key that allows access and control over Bitcoin holdings", Example: "5HueCGU8rMjxEXxiPuD5BDuG6o5xjA7QkbPp", Output: "string", Aliases: []string{ "btc private key", "wallet key", "secret key", "private wif", "signing key", }, Keywords: []string{ "bitcoin", "btc", "private", "key", "blockchain", "wallet", "signature", "base58", "wif", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return bitcoinPrivateKey(f), nil }, }) AddFuncLookup("bankname", Info{ Display: "Bank Name", Category: "payment", Description: "Name of a financial institution that offers banking services", Example: "Wells Fargo", Output: "string", Aliases: []string{ "financial institution", "banking entity", "lender name", "depository name", "institution title", }, Keywords: []string{ "bank", "name", "institution", "financial", "wells", "fargo", "chase", "citibank", "pnc", "boa", "usbank", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return bankName(f), nil }, }) AddFuncLookup("banktype", Info{ Display: "Bank Type", Category: "payment", Description: "Classification of a bank based on its services and operations", Example: "Investment Bank", Output: "string", Aliases: []string{ "bank classification", "bank category", "bank segment", "institution class", "service tier", }, Keywords: []string{ "bank", "type", "classification", "category", "segment", "investment", "commercial", "retail", "savings", "credit", "union", "central", "federal", }, Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return bankType(f), nil }, }) }