@@ -10,73 +10,49 @@ import (
10
10
"github.com/klauspost/compress/zstd"
11
11
)
12
12
13
- type Writer zstd.Encoder
13
+ type Writer struct {
14
+ enc * zstd.Encoder
14
15
15
- var _ io.WriteCloser = (* Writer )(nil )
16
-
17
- func NewWriter (w io.Writer , opts ... WriterOption ) (* Writer , error ) {
18
- zstdW , err := zstd .NewWriter (w , opts ... )
19
- if err != nil {
20
- return nil , err
21
- }
22
- return (* Writer )(zstdW ), nil
23
- }
24
-
25
- func (w * Writer ) Write (p []byte ) (int , error ) {
26
- return (* zstd .Encoder )(w ).Write (p )
27
- }
28
-
29
- func (w * Writer ) Close () error {
30
- return (* zstd .Encoder )(w ).Close ()
16
+ skw seekable.Writer
17
+ buf []byte
18
+ n int
31
19
}
32
20
33
- type Reader zstd.Decoder
34
-
35
- var _ io.ReadCloser = (* Reader )(nil )
21
+ var _ io.WriteCloser = (* Writer )(nil )
36
22
37
- func NewReader ( r io.Reader , opts ... ReaderOption ) (* Reader , error ) {
38
- zstdR , err := zstd .NewReader ( r , opts ... )
23
+ func NewWriter ( w io.Writer , opts ... WriterOption ) (* Writer , error ) {
24
+ enc , err := zstd .NewWriter ( w , opts ... )
39
25
if err != nil {
40
26
return nil , err
41
27
}
42
- return (* Reader )(zstdR ), nil
43
- }
44
-
45
- func (r * Reader ) Read (p []byte ) (int , error ) {
46
- return (* zstd .Decoder )(r ).Read (p )
47
- }
48
-
49
- func (r * Reader ) Close () error {
50
- (* zstd .Decoder )(r ).Close () // no error returned
51
- return nil
52
- }
53
-
54
- type SeekableWriter struct {
55
- buf []byte
56
- n int
57
- w seekable.Writer
28
+ return & Writer {
29
+ enc : enc ,
30
+ }, nil
58
31
}
59
32
60
- var _ io.WriteCloser = (* SeekableWriter )(nil )
61
-
62
- func NewSeekableWriter (w io.Writer , blockSize int , opts ... WriterOption ) (* SeekableWriter , error ) {
63
- zstdW , err := zstd .NewWriter (nil , opts ... )
33
+ func NewSeekableWriter (w io.Writer , blockSize int , opts ... WriterOption ) (* Writer , error ) {
34
+ enc , err := zstd .NewWriter (nil , opts ... )
64
35
if err != nil {
65
36
return nil , err
66
37
}
67
38
68
- seekableW , err := seekable .NewWriter (w , zstdW )
39
+ skw , err := seekable .NewWriter (w , enc )
69
40
if err != nil {
70
41
return nil , err
71
42
}
72
43
73
- return & SeekableWriter {
44
+ return & Writer {
45
+ enc : enc ,
46
+ skw : skw ,
74
47
buf : make ([]byte , blockSize ),
75
- w : seekableW ,
76
48
}, nil
77
49
}
78
50
79
- func (w * SeekableWriter ) Write (p []byte ) (int , error ) {
51
+ func (w * Writer ) Write (p []byte ) (int , error ) {
52
+ if w .skw != nil {
53
+ return w .enc .Write (p )
54
+ }
55
+
80
56
written := 0
81
57
for len (p ) > 0 {
82
58
n := copy (w .buf [w .n :], p )
@@ -85,7 +61,7 @@ func (w *SeekableWriter) Write(p []byte) (int, error) {
85
61
p = p [n :]
86
62
87
63
if w .n == len (w .buf ) {
88
- if _ , err := w .w .Write (w .buf ); err != nil {
64
+ if _ , err := w .skw .Write (w .buf ); err != nil {
89
65
return written , err
90
66
}
91
67
w .n = 0
@@ -94,13 +70,48 @@ func (w *SeekableWriter) Write(p []byte) (int, error) {
94
70
return written , nil
95
71
}
96
72
97
- func (w * SeekableWriter ) Close () error {
98
- if w .n > 0 {
99
- if _ , err := w .w .Write (w .buf [:w .n ]); err != nil {
73
+ func (w * Writer ) Close () error {
74
+ if w .skw != nil {
75
+ if w .n > 0 {
76
+ if _ , err := w .skw .Write (w .buf [:w .n ]); err != nil {
77
+ return err
78
+ }
79
+ }
80
+ if err := w .skw .Close (); err != nil {
100
81
return err
101
82
}
102
83
}
103
- return w .w .Close ()
84
+ return w .enc .Close ()
85
+ }
86
+
87
+ type Reader struct {
88
+ dec * zstd.Decoder
89
+ skr seekable.Reader
90
+ }
91
+
92
+ var _ io.ReadCloser = (* Reader )(nil )
93
+
94
+ func NewReader (r io.Reader , opts ... ReaderOption ) (* Reader , error ) {
95
+ dec , err := zstd .NewReader (r , opts ... )
96
+ if err != nil {
97
+ return nil , err
98
+ }
99
+ return & Reader {
100
+ dec : dec ,
101
+ }, nil
102
+ }
103
+
104
+ func (r * Reader ) Read (p []byte ) (int , error ) {
105
+ return r .dec .Read (p )
106
+ }
107
+
108
+ func (r * Reader ) Close () error {
109
+ r .dec .Close () // no error returned
110
+ return nil
111
+ }
112
+
113
+ func (r * Reader ) SeekReader () (seekable.Reader , error ) {
114
+ return r .skr
104
115
}
105
116
106
117
type SeekableReader seekable.Reader
0 commit comments