From fee2e3cc2f3dbc274ad0cdea48253bacd47efea4 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Sun, 16 Mar 2025 12:38:36 -0500 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Modify=20UUID=20to=20allow?= =?UTF-8?q?=20for=20other=20versions.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.go | 2 +- gen_rand.go | 45 +++++++++++++++++++++++++++++++-------- gen_rand_examples_test.go | 28 +++++++++++++----------- gen_rand_test.go | 4 ++-- 4 files changed, 55 insertions(+), 24 deletions(-) diff --git a/config.go b/config.go index a7da5f5..945e588 100644 --- a/config.go +++ b/config.go @@ -14,7 +14,7 @@ func NewConfig(options ...Option) Config { conf := Config{ extension: ".txt", separator: "_", - generator: uuidGen, + generator: UUID(nil), } for _, opt := range options { opt(&conf) diff --git a/gen_rand.go b/gen_rand.go index 8b4ce5a..de71723 100644 --- a/gen_rand.go +++ b/gen_rand.go @@ -8,17 +8,44 @@ import ( "github.com/google/uuid" ) -func uuidGen(*Config) (string, error) { - u, err := uuid.NewRandom() - if err != nil { - return "", err - } - return u.String(), nil +// UUIDer is an interface for generating UUIDs. +// It is recommended that you use either the UUIDv4 or UUIDv7 variables. +type UUIDer interface { + UUID() (uuid.UUID, error) } -// UUID generates a UUIDv4. -func UUID() Generator { - return uuidGen +// UUIDFunc is a function that generates a UUID. +type UUIDFunc func() (uuid.UUID, error) + +// UUID allows UUIDFunc to be used as a UUIDer. +func (u UUIDFunc) UUID() (uuid.UUID, error) { + return u() +} + +var ( + // UUIDv1. You probably don't want to use this. It is included for completeness sake. + UUIDv1 = UUIDFunc(uuid.NewUUID) + // UUIDv4 is the default. + UUIDv4 = UUIDFunc(uuid.NewRandom) + // UUIDv6 is primarily a replacement for UUIDv1. You probably should use 4 or 7. + UUIDv6 = UUIDFunc(uuid.NewV6) + // UUIDv7 should be used if you want it sortable by time. + UUIDv7 = UUIDFunc(uuid.NewV7) +) + +// UUID generates a UUID. If nil.is passed as an argument, +// a UUIDv4 is generated. +func UUID(u UUIDer) Generator { + if u == nil { + u = UUIDv4 + } + return func(*Config) (string, error) { + uu, err := u.UUID() + if err != nil { + return "", err + } + return uu.String(), nil + } } type randConf struct { diff --git a/gen_rand_examples_test.go b/gen_rand_examples_test.go index 45cb7fe..29737fa 100644 --- a/gen_rand_examples_test.go +++ b/gen_rand_examples_test.go @@ -7,30 +7,34 @@ import ( ) func ExampleUUID() { - option := nomino.WithGenerator(nomino.UUID()) + gen := nomino.UUID(nil) - str, _ := nomino.Make(nomino.NewConfig(option)) + str, _ := gen.Make() fmt.Println(str) - str, _ = nomino.Make(nomino.NewConfig(option)) + str, _ = gen.Make() + fmt.Println(str) +} + +func ExampleUUID_v7() { + gen := nomino.UUID(nomino.UUIDv7) + + str, _ := gen.Make() fmt.Println(str) - str, _ = nomino.Make(nomino.NewConfig(option)) + str, _ = gen.Make() + fmt.Println(str) + + str, _ = gen.Make() fmt.Println(str) } func ExampleRandom() { - option := nomino.WithGenerator(nomino.Random()) - - str, _ := nomino.Make(nomino.NewConfig(option)) + str, _ := nomino.Random().Make() fmt.Println(str) } func ExampleRandomLength() { - option := nomino.WithGenerator(nomino.Random( - nomino.RandomLength(32), - )) - - str, _ := nomino.Make(nomino.NewConfig(option)) + str, _ := nomino.Random(nomino.RandomLength(32)).Make() fmt.Println(str) } diff --git a/gen_rand_test.go b/gen_rand_test.go index 832275b..51fc73f 100644 --- a/gen_rand_test.go +++ b/gen_rand_test.go @@ -9,7 +9,7 @@ import ( ) func TestUUID(t *testing.T) { - st, err := UUID()(nil) + st, err := UUID(nil)(nil) assert.NoError(t, err) _, parseErr := uuid.Parse(st) assert.NoError(t, parseErr) @@ -25,7 +25,7 @@ func TestUUIDFail(t *testing.T) { uuid.SetRand(badRead{}) defer uuid.SetRand(nil) - _, err := UUID()(nil) + _, err := UUID(nil)(nil) assert.Equal(t, errors.New("sorry"), err) }