go-faker/cmd/gofaker/main.go
selamanapps 4ff98a40d4 feat: initial go-faker - Ethiopian fake data generator
- High-performance batch data generation (~150k records/sec)
- Seeded randomness for reproducible load tests
- Rich Ethiopian data: names, phones (+251), cities, regions
- Four data types: person, address, product, analytics
- Three modes: CLI, Go library, HTTP API
- Project skill available in .skills/go-faker/SKILL.md
2026-05-02 02:59:43 +03:00

81 lines
No EOL
1.7 KiB
Go

package main
import (
"encoding/json"
"flag"
"fmt"
"os"
"go-faker/api"
"go-faker/generator"
"go-faker/types"
)
var (
serverMode bool
addr string
seed string
count int
dataType string
fieldsStr string
)
func init() {
flag.BoolVar(&serverMode, "server", false, "Run as HTTP API server")
flag.StringVar(&addr, "addr", ":8080", "Server address")
flag.StringVar(&seed, "seed", "default", "Random seed for reproducible data")
flag.IntVar(&count, "count", 10, "Number of records to generate")
flag.StringVar(&dataType, "type", "person", "Data type: person, address, product, analytics")
flag.StringVar(&fieldsStr, "fields", "", "Comma-separated fields (empty = all)")
}
func main() {
flag.Parse()
if serverMode {
server := api.NewServer(addr)
if err := server.Start(); err != nil {
fmt.Fprintf(os.Stderr, "Server error: %v\n", err)
os.Exit(1)
}
return
}
dt := types.DataType(dataType)
validFields, ok := types.ValidFields[dt]
if !ok {
fmt.Fprintf(os.Stderr, "Invalid type: %s. Valid types: person, address, product, analytics\n", dataType)
os.Exit(1)
}
var fields []string
if fieldsStr == "" {
fields = validFields
} else {
fields = splitFields(fieldsStr)
}
faker := generator.New(seed)
results := faker.GenerateBatch(count, dt, fields)
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
if err := enc.Encode(results); err != nil {
fmt.Fprintf(os.Stderr, "JSON encode error: %v\n", err)
os.Exit(1)
}
}
func splitFields(s string) []string {
var result []string
start := 0
for i := 0; i <= len(s); i++ {
if i == len(s) || s[i] == ',' {
if start < i {
result = append(result, s[start:i])
}
start = i + 1
}
}
return result
}