Skip to content

Commit 86030ef

Browse files
authored
BREAKING CHANGE: refactor misc (#100)
2 parents aa73ab9 + f8deef2 commit 86030ef

File tree

15 files changed

+177
-105
lines changed

15 files changed

+177
-105
lines changed

archive/zip/add.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func (f addFileToZipDecompressionBombLimit) apply(cfg *addFileToZipConfig) {
2222
cfg.decompressionBombLimit = int64(f)
2323
}
2424

25-
func WithAddFileToZipDecompressionBombLimit(decompressionBombLimit int64) AddFileToZipOption { //nolint:ireturn
25+
func WithAddFileToZipOptionDecompressionBombLimit(decompressionBombLimit int64) AddFileToZipOption { //nolint:ireturn
2626
return addFileToZipDecompressionBombLimit(decompressionBombLimit)
2727
}
2828

archive/zip/zip.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ func WithZipDirOptionWalkFunc(f func(path string, info os.FileInfo, err error) e
3636
}
3737

3838
func (f zipDirOptionPathInZipHandlerFunc) apply(cfg *zipDirConfig) { cfg.pathInZipHandlerFunc = f.f }
39+
40+
// WithZipDirOptionPathInZipHandlerFunc is a function to specify the path in the zip file.
3941
func WithZipDirOptionPathInZipHandlerFunc(f func(path string) string) ZipDirOption { //nolint:ireturn
4042
return zipDirOptionPathInZipHandlerFunc{f}
4143
}

crypto/rand/rand.go

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,40 @@ package randz
22

33
import (
44
crypto_rand "crypto/rand"
5+
"fmt"
56
"io"
67
)
78

8-
const DefaultRandomSource = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
9+
const DefaultStringReaderRandomSource = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
910

1011
//nolint:gochecknoglobals
1112
var (
12-
DefaultReader io.Reader = NewReader()
13+
StringReader = NewReader()
1314
)
1415

15-
type Reader struct {
16-
RandomSource string
17-
RandomReader io.Reader
16+
type reader struct {
17+
randomSource string
18+
randomReader io.Reader
1819
}
1920

20-
type ReaderOption func(r *Reader)
21+
type NewReaderOption func(r *reader)
2122

22-
func WithRandomSource(str string) ReaderOption {
23-
return func(r *Reader) {
24-
r.RandomSource = str
23+
func WithNewReaderRandomSource(s string) NewReaderOption {
24+
return func(r *reader) {
25+
r.randomSource = s
2526
}
2627
}
2728

28-
func WithRandomReader(reader io.Reader) ReaderOption {
29-
return func(r *Reader) {
30-
r.RandomReader = reader
29+
func WithNewReaderOptionRandomReader(random io.Reader) NewReaderOption {
30+
return func(r *reader) {
31+
r.randomReader = random
3132
}
3233
}
3334

34-
func NewReader(opts ...ReaderOption) *Reader {
35-
r := &Reader{
36-
RandomSource: DefaultRandomSource,
37-
RandomReader: crypto_rand.Reader,
35+
func NewReader(opts ...NewReaderOption) io.Reader {
36+
r := &reader{
37+
randomSource: DefaultStringReaderRandomSource,
38+
randomReader: crypto_rand.Reader,
3839
}
3940

4041
for _, opt := range opts {
@@ -44,32 +45,25 @@ func NewReader(opts ...ReaderOption) *Reader {
4445
return r
4546
}
4647

47-
func (r *Reader) Read(p []byte) (n int, err error) {
48-
n, err = io.ReadFull(r.RandomReader, p)
49-
50-
randomSourceLength := len(r.RandomSource)
51-
for i := range p {
52-
p[i] = r.RandomSource[int(p[i])%randomSourceLength]
48+
func (r *reader) Read(p []byte) (n int, err error) {
49+
n, err = io.ReadFull(r.randomReader, p)
50+
if err != nil {
51+
return n, fmt.Errorf("io.ReadFull: %w", err)
5352
}
5453

55-
return n, err //nolint:wrapcheck
56-
}
57-
58-
func (r *Reader) ReadString(length int) (random string, err error) {
59-
b := make([]byte, length)
60-
61-
if _, err := io.ReadFull(r, b); err != nil {
62-
return "", err //nolint:wrapcheck
54+
randomSourceLength := len(r.randomSource)
55+
for i := range p {
56+
p[i] = r.randomSource[int(p[i])%randomSourceLength]
6357
}
6458

65-
return string(b), nil
59+
return n, nil
6660
}
6761

68-
func ReadString(length int) (random string, err error) {
62+
func ReadString(random io.Reader, length int) (string, error) {
6963
b := make([]byte, length)
7064

71-
if _, err := io.ReadFull(DefaultReader, b); err != nil {
72-
return "", err //nolint:wrapcheck
65+
if _, err := io.ReadFull(random, b); err != nil {
66+
return "", fmt.Errorf("io.ReadFull: %w", err)
7367
}
7468

7569
return string(b), nil

crypto/rand/rand_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ var ExampleReader = bytes.NewBufferString("" +
2929
)
3030

3131
func Example() {
32-
r := randz.NewReader(randz.WithRandomReader(ExampleReader))
33-
s, err := r.ReadString(128)
32+
r := randz.NewReader(randz.WithNewReaderOptionRandomReader(ExampleReader))
33+
s, err := randz.ReadString(r, 128)
3434
if err != nil {
3535
log.Printf("(*randz.Reader).ReadString: %v", err)
3636
return
@@ -45,27 +45,27 @@ func TestCreateCodeVerifier(t *testing.T) {
4545

4646
t.Run("success()", func(t *testing.T) {
4747
t.Parallel()
48-
actual, err := randz.ReadString(128)
48+
actual, err := randz.ReadString(randz.StringReader, 128)
4949
if err != nil {
5050
t.Errorf("❌: err != nil: %v", err)
5151
}
5252
t.Logf("✅: cv=%s", actual)
5353

54-
backup := randz.DefaultReader
55-
t.Cleanup(func() { randz.DefaultReader = backup })
56-
randz.DefaultReader = bytes.NewBuffer(nil)
57-
if _, err := randz.ReadString(128); err == nil {
54+
backup := randz.StringReader
55+
t.Cleanup(func() { randz.StringReader = backup })
56+
randz.StringReader = bytes.NewBuffer(nil)
57+
if _, err := randz.ReadString(randz.StringReader, 128); err == nil {
5858
t.Errorf("❌: err == nil: %v", err)
5959
}
6060
})
6161

6262
t.Run("success()", func(t *testing.T) {
6363
t.Parallel()
6464
const expect = "wxyz012345wxyz012345wxyz012345wxyz012345wxyz012345wxyz012345wxyz012345wxyz012345wxyz012345wxyz012345wxyz012345wxyz012345wxyz0123"
65-
r := randz.NewReader(randz.WithRandomReader(bytes.NewBufferString(
65+
r := randz.NewReader(randz.WithNewReaderOptionRandomReader(bytes.NewBufferString(
6666
"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567",
67-
)), randz.WithRandomSource(randz.DefaultRandomSource))
68-
actual, err := r.ReadString(128)
67+
)), randz.WithNewReaderRandomSource(randz.DefaultStringReaderRandomSource))
68+
actual, err := randz.ReadString(r, 128)
6969
if err != nil {
7070
t.Errorf("❌: err != nil: %v", err)
7171
}
@@ -76,8 +76,8 @@ func TestCreateCodeVerifier(t *testing.T) {
7676

7777
t.Run("failure(io.EOF)", func(t *testing.T) {
7878
t.Parallel()
79-
r := randz.NewReader(randz.WithRandomReader(bytes.NewReader(nil)))
80-
_, actual := r.ReadString(128)
79+
r := randz.NewReader(randz.WithNewReaderOptionRandomReader(bytes.NewReader(nil)))
80+
_, actual := randz.ReadString(r, 128)
8181
if actual == nil {
8282
t.Errorf("❌: err == nil")
8383
}
@@ -92,7 +92,7 @@ func BenchmarkGenerateRandomString(b *testing.B) {
9292
b.ResetTimer()
9393

9494
b.Run("r.Read/mrand.Reader", func(b *testing.B) {
95-
r := randz.NewReader(randz.WithRandomReader(mrand.New(mrand.NewSource(0))))
95+
r := randz.NewReader(randz.WithNewReaderOptionRandomReader(mrand.New(mrand.NewSource(0))))
9696
buf := make([]byte, 128)
9797

9898
for i := 0; i < b.N; i++ {
@@ -101,7 +101,7 @@ func BenchmarkGenerateRandomString(b *testing.B) {
101101
})
102102

103103
b.Run("r.Read/crypto_rand.Reader", func(b *testing.B) {
104-
r := randz.NewReader(randz.WithRandomReader(crypto_rand.Reader))
104+
r := randz.NewReader(randz.WithNewReaderOptionRandomReader(crypto_rand.Reader))
105105
buf := make([]byte, 128)
106106

107107
for i := 0; i < b.N; i++ {

database/sql/queryer_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"reflect"
99
"testing"
1010

11-
"github.com/kunitsucom/util.go/pointer"
11+
genericz "github.com/kunitsucom/util.go/generics"
1212
slicez "github.com/kunitsucom/util.go/slices"
1313
)
1414

@@ -44,7 +44,7 @@ func Test_DB_queryContext(t *testing.T) {
4444
case "username":
4545
reflect.ValueOf(dest[dstIdx]).Elem().SetString(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))
4646
case "null_string":
47-
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(pointer.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
47+
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(genericz.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
4848
}
4949
}
5050
}
@@ -105,7 +105,7 @@ func Test_DB_queryRowContext(t *testing.T) {
105105
case "username":
106106
reflect.ValueOf(dest[dstIdx]).Elem().SetString(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))
107107
case "null_string":
108-
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(pointer.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
108+
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(genericz.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
109109
}
110110
}
111111
}

database/sql/rows_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"reflect"
99
"testing"
1010

11-
"github.com/kunitsucom/util.go/pointer"
11+
genericz "github.com/kunitsucom/util.go/generics"
1212
slicez "github.com/kunitsucom/util.go/slices"
1313
)
1414

@@ -92,7 +92,7 @@ func Test_ScanRows(t *testing.T) {
9292
case "username":
9393
reflect.ValueOf(dest[dstIdx]).Elem().SetString(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))
9494
case "null_string":
95-
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(pointer.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
95+
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(genericz.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
9696
}
9797
}
9898
}
@@ -137,7 +137,7 @@ func Test_ScanRows(t *testing.T) {
137137
case "username":
138138
reflect.ValueOf(dest[dstIdx]).Elem().SetString(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))
139139
case "null_string":
140-
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(pointer.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
140+
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(genericz.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
141141
}
142142
}
143143
}
@@ -186,7 +186,7 @@ func Test_ScanRows(t *testing.T) {
186186
case "username":
187187
reflect.ValueOf(dest[dstIdx]).Elem().SetString(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))
188188
case "null_string":
189-
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(pointer.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
189+
reflect.ValueOf(dest[dstIdx]).Elem().Set(reflect.ValueOf(genericz.Pointer(columns[colIdx] + "_" + fmt.Sprintf("%03d", i))))
190190
}
191191
}
192192
}

exp/os/os.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package osz
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"os"
7+
)
8+
9+
func ReadlinkAndReadFile(path string) (resolved string, bytes []byte, err error) {
10+
if p, err := os.Readlink(path); errors.Is(err, nil) {
11+
path = p
12+
}
13+
14+
b, err := os.ReadFile(path)
15+
if err != nil {
16+
return "", nil, fmt.Errorf("os.ReadFile: %w", err)
17+
}
18+
19+
return path, b, nil
20+
}

exp/os/os_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package osz_test
2+
3+
import (
4+
"os"
5+
"runtime"
6+
"testing"
7+
8+
osz "github.com/kunitsucom/util.go/exp/os"
9+
)
10+
11+
var _, callerFile, _, _ = runtime.Caller(1)
12+
13+
//nolint:paralleltest
14+
func TestReadlinkAndReadFile(t *testing.T) {
15+
t.Run("success()", func(t *testing.T) {
16+
expect := callerFile
17+
linkTestFile := expect + ".symlink"
18+
_ = os.Symlink(expect, linkTestFile)
19+
t.Cleanup(func() {
20+
_ = os.Remove(linkTestFile)
21+
})
22+
actual, _, err := osz.ReadlinkAndReadFile(linkTestFile)
23+
if err != nil {
24+
t.Errorf("❌: err != nil: %v", err)
25+
}
26+
if expect != actual {
27+
t.Errorf("❌: expect != actual: %v != %v", expect, actual)
28+
}
29+
})
30+
31+
t.Run("failure()", func(t *testing.T) {
32+
for _, path := range []string{"path_not_exist"} {
33+
if _, _, err := osz.ReadlinkAndReadFile(path); err == nil {
34+
t.Errorf("❌: path `%s` should not exist", path)
35+
}
36+
}
37+
})
38+
}

generics/pointer.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package genericz
2+
3+
func Pointer[T any](v T) *T {
4+
return &v
5+
}
6+
7+
func IsZero[T comparable](v T) bool {
8+
var zero T
9+
return v == zero
10+
}
11+
12+
func Zero[T comparable](_ T) T { //nolint:ireturn
13+
var zero T
14+
return zero
15+
}

generics/pointer_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package genericz_test
2+
3+
import (
4+
"testing"
5+
6+
genericz "github.com/kunitsucom/util.go/generics"
7+
)
8+
9+
func TestPointer(t *testing.T) {
10+
t.Parallel()
11+
12+
t.Run("success()", func(t *testing.T) {
13+
t.Parallel()
14+
actual := genericz.Pointer("test")
15+
if *actual != "test" {
16+
t.Errorf("❌: *actual != test: %v", *actual)
17+
}
18+
})
19+
}
20+
21+
func TestIsZero(t *testing.T) {
22+
t.Parallel()
23+
24+
t.Run("success()", func(t *testing.T) {
25+
t.Parallel()
26+
if actual := !genericz.IsZero(""); actual {
27+
t.Errorf("❌: !genericz.IsZero(\"\"): %v", actual)
28+
}
29+
if actual := genericz.IsZero("test"); actual {
30+
t.Errorf("❌: genericz.IsZero(\"test\"): %v", actual)
31+
}
32+
})
33+
}
34+
35+
func TestZero(t *testing.T) {
36+
t.Parallel()
37+
38+
t.Run("success()", func(t *testing.T) {
39+
t.Parallel()
40+
if actual := genericz.Zero("1"); actual != "" {
41+
t.Errorf("❌: genericz.Zero(\"1\"): %v", actual)
42+
}
43+
if actual := genericz.Zero(1); actual != 0 {
44+
t.Errorf("❌: genericz.Zero(1): %v", actual)
45+
}
46+
})
47+
}

0 commit comments

Comments
 (0)