@@ -4,7 +4,8 @@ Package fake provides utilities for generating fake data.
44package fake
55
66import (
7- "crypto/rand"
7+ cryptrnd "crypto/rand"
8+ "encoding/hex"
89 "fmt"
910 "io"
1011 "time"
@@ -32,87 +33,80 @@ var postalCodes = []string{"12345", "23456", "34567", "45678", "56789", "67890",
3233// RandomUUID generates a fake UUIDv4.
3334func RandomUUID () (string , error ) {
3435 uuid := make ([]byte , 16 )
35- _ , err := io .ReadFull (rand .Reader , uuid )
36+ _ , err := io .ReadFull (cryptrnd .Reader , uuid )
3637 if err != nil {
37- return "" , err
38+ return "" , fmt . Errorf ( "failed to generate random UUID: %w" , err )
3839 }
3940
4041 // Set the version to 4
4142 uuid [6 ] = (uuid [6 ] & 0x0f ) | 0x40
4243 // Set the variant to 2 (RFC 4122)
4344 uuid [8 ] = (uuid [8 ] & 0x3f ) | 0x80
4445
45- return fmt .Sprintf ("%08x-%04x-%04x-%04x-%12x" , uuid [:4 ], uuid [4 :6 ], uuid [6 :8 ], uuid [8 :10 ], uuid [10 :]), nil
46+ uuidStr := hex .EncodeToString (uuid )
47+
48+ return uuidStr [0 :8 ] + "-" + uuidStr [8 :12 ] + "-" + uuidStr [12 :16 ] + "-" + uuidStr [16 :20 ] + "-" + uuidStr [20 :32 ], nil
4649}
4750
4851// RandomDate generates a random date.
4952func RandomDate () (time.Time , error ) {
50- start := time .Date (EpochYear , time .Month (EpochMonth ), EpochDay , EpochHour , EpochMinute , EpochSecond , EpochNano , time .UTC ).Unix ()
51- end := time .Now ().Unix ()
52-
53- sec , err := rnd .NumberInRange (start , end )
54- if err != nil {
55- return time.Time {}, err
56- }
53+ start := time .Date (EpochYear , time .Month (EpochMonth ), EpochDay , EpochHour , EpochMinute , EpochSecond , EpochNano , time .UTC ).UnixNano ()
54+ end := time .Now ().UnixNano ()
5755
58- nsec , err := rnd .NumberInRange (0 , 1e9 )
56+ nanos , err := rnd .NumberInRange (start , end )
5957 if err != nil {
60- return time.Time {}, err
58+ return time.Time {}, fmt . Errorf ( "failed to generate random time: %w" , err )
6159 }
6260
63- return time .Unix (sec , nsec ), nil
61+ return time .Unix (0 , nanos ), nil
6462}
6563
6664// RandomPhoneNumber generates a random phone number.
6765func RandomPhoneNumber () (string , error ) {
6866 areaCode , err := rnd .NumberInRange (100 , 999 )
6967 if err != nil {
70- return "" , err
68+ return "" , fmt . Errorf ( "failed to generate areaCode: %w" , err )
7169 }
7270
7371 firstPart , err := rnd .NumberInRange (100 , 999 )
7472 if err != nil {
75- return "" , err
73+ return "" , fmt . Errorf ( "failed to generate firstPart: %w" , err )
7674 }
7775
7876 secondPart , err := rnd .NumberInRange (1000 , 9999 )
7977 if err != nil {
80- return "" , err
78+ return "" , fmt . Errorf ( "failed to generate secondPart: %w" , err )
8179 }
8280
83- return fmt .Sprintf ("+1 (%d ) %d-%d " , areaCode , firstPart , secondPart ), nil
81+ return fmt .Sprintf ("+1 (%03d ) %03d-%04d " , areaCode , firstPart , secondPart ), nil
8482}
8583
8684// RandomAddress generates a random address.
8785func RandomAddress () (string , error ) {
88- streetNumber , err := rnd .NumberInRange (0 , MaxStreetNumber )
86+ streetNumber , err := rnd .NumberInRange (1 , MaxStreetNumber )
8987 if err != nil {
90- return "" , err
88+ return "" , fmt . Errorf ( "failed to generate street number: %w" , err )
9189 }
9290
93- idx , err := rnd .NumberInRange ( 0 , int64 ( len ( streetNames ) - 1 ) )
91+ streetName , err := rnd .Pick ( streetNames )
9492 if err != nil {
95- return "" , err
93+ return "" , fmt . Errorf ( "failed to pick street name: %w" , err )
9694 }
97- streetName := streetNames [idx ]
9895
99- idx , err = rnd .NumberInRange ( 0 , int64 ( len ( streetNames ) - 1 ) )
96+ city , err : = rnd .Pick ( cities )
10097 if err != nil {
101- return "" , err
98+ return "" , fmt . Errorf ( "failed to pick city: %w" , err )
10299 }
103- city := cities [idx ]
104100
105- idx , err = rnd .NumberInRange ( 0 , int64 ( len ( states ) - 1 ) )
101+ state , err : = rnd .Pick ( states )
106102 if err != nil {
107- return "" , err
103+ return "" , fmt . Errorf ( "failed to pick state: %w" , err )
108104 }
109- state := states [idx ]
110105
111- idx , err = rnd .NumberInRange ( 0 , int64 ( len ( postalCodes ) - 1 ) )
106+ postalCode , err : = rnd .Pick ( postalCodes )
112107 if err != nil {
113- return "" , err
108+ return "" , fmt . Errorf ( "failed to pick postal code: %w" , err )
114109 }
115- postalCode := postalCodes [idx ]
116110
117111 return fmt .Sprintf ("%d %s, %s, %s %s, USA" , streetNumber , streetName , city , state , postalCode ), nil
118112}
0 commit comments