Skip to content

Commit

Permalink
Refactor name provider
Browse files Browse the repository at this point in the history
  • Loading branch information
sepisoltani committed Apr 30, 2024
1 parent a65728e commit a1c3e1d
Show file tree
Hide file tree
Showing 7 changed files with 168 additions and 181 deletions.
Empty file removed data/languages.json
Empty file.
106 changes: 0 additions & 106 deletions data/names.json

This file was deleted.

Empty file removed data/paragraphs.json
Empty file.
Empty file removed data/sentences.json
Empty file.
3 changes: 3 additions & 0 deletions generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"github.com/sepisoltani/persian-faker/providers/bill"
"github.com/sepisoltani/persian-faker/providers/digit"
"github.com/sepisoltani/persian-faker/providers/location"
"github.com/sepisoltani/persian-faker/providers/name"
"github.com/sepisoltani/persian-faker/providers/phonenumber"
)

Expand All @@ -15,6 +16,7 @@ type DataGenerator struct {
Digit *digit.Digit
PhoneNumber *phonenumber.PhoneNumber
Location *location.Location
Name *name.Name
}

func NewDataGenerator() *DataGenerator {
Expand All @@ -24,5 +26,6 @@ func NewDataGenerator() *DataGenerator {
Digit: &digit.Digit{},
PhoneNumber: &phonenumber.PhoneNumber{},
Location: &location.Location{},
Name: &name.Name{},
}
}
164 changes: 115 additions & 49 deletions providers/name/name.go
Original file line number Diff line number Diff line change
@@ -1,65 +1,131 @@
package names
package name

import (
"encoding/json"
"math/rand"
"os"
"path/filepath"
"time"
)

// NameData represents the structure for names data.
type NameData struct {
FirstNames []string `json:"firstNames"`
LastNames []string `json:"lastNames"`
var firstNames = []string{
"علی",
"مریم",
"حسن",
"زهرا",
"رضا",
"فاطمه",
"محمد",
"سارا",
"جواد",
"لیلا",
"امیر",
"نازنین",
"مجید",
"سمانه",
"کیان",
"نگین",
"شهاب",
"پریسا",
"مهدی",
"الهام",
"عرفان",
"تینا",
"بهنام",
"زینب",
"پویا",
"سپیده",
"کامران",
"ملیکا",
"یاسر",
"مینا",
"بهزاد",
"آناهیتا",
"فرشاد",
"مهسا",
"رامین",
"سحر",
"عباس",
"فریبا",
"هومن",
"آزاده",
"بهروز",
"سمیرا",
"سعید",
"شیرین",
"آرش",
"کتایون",
"فرید",
"هدیه",
"مانی",
"رویا",
}

// DataLoader is the interface for loading name data.
type DataLoader interface {
LoadData(path string) (NameData, error)
var lastNames = []string{
"محمدی",
"هاشمی",
"سلطانی",
"احمدی",
"رضایی",
"کریمی",
"جعفری",
"حسینی",
"نجفی",
"شیرازی",
"فرزانه",
"علوی",
"رستمی",
"موسوی",
"کاشانی",
"تهرانی",
"صادقی",
"قاسمی",
"میرزایی",
"نوری",
"رحیمی",
"کوهی",
"شاهین",
"زارع",
"بهاری",
"عبدی",
"چراغی",
"امینی",
"پهلوان",
"تاج",
"داودی",
"صفری",
"باقری",
"زمانی",
"کوچکی",
"آقایی",
"مهدوی",
"جمشیدی",
"گلزار",
"پارسا",
"صمدی",
"شفیعی",
"مرادی",
"بابایی",
"حیدری",
"خانی",
"یزدانی",
"سلطانپور",
"فخری",
"ملکی",
}
var rng = rand.New(rand.NewSource(time.Now().UnixNano()))

// FileDataLoader loads name data from a file.
type FileDataLoader struct{}

func (fdl FileDataLoader) LoadData(path string) (NameData, error) {
var data NameData
file, err := os.ReadFile(path)
if err != nil {
return data, err
}
err = json.Unmarshal(file, &data)
return data, err
}

// NameGenerator holds the loaded name data and the random generator.
type NameGenerator struct {
Data NameData
Rand *rand.Rand
}

// NewNameGenerator creates a new NameGenerator with data loaded using the given DataLoader and random source.
func NewNameGenerator(loader DataLoader, seed int64) (*NameGenerator, error) {
dataPath := filepath.Join("data", "names.json")
data, err := loader.LoadData(dataPath)
if err != nil {
return nil, err
}
src := rand.NewSource(seed)
rng := rand.New(src)
return &NameGenerator{Data: data, Rand: rng}, nil
type Name struct {
}

// RandomFirstName returns a random Persian first name.
func (ng *NameGenerator) RandomFirstName() string {
return ng.Data.FirstNames[ng.Rand.Intn(len(ng.Data.FirstNames))]
// GenerateFirstName returns a random Persian first name.
func (Name) GenerateFirstName() string {
return firstNames[rng.Intn(len(firstNames))]
}

// RandomLastName returns a random Persian last name.
func (ng *NameGenerator) RandomLastName() string {
return ng.Data.LastNames[ng.Rand.Intn(len(ng.Data.LastNames))]
// GenerateLastName returns a random Persian last name.
func (Name) GenerateLastName() string {
return lastNames[rng.Intn(len(lastNames))]
}

// RandomFullName returns a random Persian full name.
func (ng *NameGenerator) RandomFullName() string {
return ng.RandomFirstName() + " " + ng.RandomLastName()
// GenerateFullName returns a random Persian full name.
func (name Name) GenerateFullName() string {
return name.GenerateFirstName() + " " + name.GenerateLastName()
}
Loading

0 comments on commit a1c3e1d

Please sign in to comment.