4b3d5d12f8
Added some TODOs
52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
package compression
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"io"
|
|
|
|
"github.com/klauspost/compress/zstd"
|
|
)
|
|
|
|
//Zstd is a zstd compressor/decompressor
|
|
type Zstd struct {
|
|
CompressionLevel int32
|
|
}
|
|
|
|
//NewZstdCompressorWithOptions creates a new Zstd with options read from the given reader
|
|
func NewZstdCompressorWithOptions(r io.Reader) (*Zstd, error) {
|
|
var zstd Zstd
|
|
err := binary.Read(r, binary.LittleEndian, &zstd)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &zstd, nil
|
|
}
|
|
|
|
//Decompress decompresses all data from the reader and returns the uncompressed data
|
|
func (z *Zstd) Decompress(r io.Reader) ([]byte, error) {
|
|
rdr, err := zstd.NewReader(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rdr.Close()
|
|
var buf bytes.Buffer
|
|
_, err = io.Copy(&buf, rdr)
|
|
return buf.Bytes(), err
|
|
}
|
|
|
|
//Compress impelements compression.Compress
|
|
func (z *Zstd) Compress(data []byte) ([]byte, error) {
|
|
var buf bytes.Buffer
|
|
w, err := zstd.NewWriter(&buf, zstd.WithEncoderLevel(zstd.EncoderLevel(z.CompressionLevel)))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
_, err = w.Write(data)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
w.Close()
|
|
return buf.Bytes(), nil
|
|
}
|