81 lines
1.7 KiB
Go
81 lines
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
|
||
|
|
}
|