github.com/zly-app/zapp@v1.3.3/pkg/compactor/zstd.go (about)

     1  package compactor
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  
     7  	"github.com/klauspost/compress/zstd"
     8  )
     9  
    10  const ZStdCompactorName = "zstd"
    11  
    12  type ZStdCompactor struct{}
    13  
    14  func (z ZStdCompactor) Compress(in io.Reader, out io.Writer) error {
    15  	opts := []zstd.EOption{
    16  		zstd.WithEncoderLevel(zstd.SpeedFastest), // 最快压缩
    17  	}
    18  	enc, err := zstd.NewWriter(out, opts...)
    19  	if err != nil {
    20  		return err
    21  	}
    22  	_, err = io.Copy(enc, in)
    23  	if err != nil {
    24  		_ = enc.Close()
    25  		return err
    26  	}
    27  	return enc.Close()
    28  }
    29  
    30  func (z ZStdCompactor) CompressBytes(in []byte) (out []byte, err error) {
    31  	var outIO bytes.Buffer
    32  	err = z.Compress(bytes.NewReader(in), &outIO)
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  	return outIO.Bytes(), nil
    37  }
    38  
    39  func (z ZStdCompactor) UnCompress(in io.Reader, out io.Writer) error {
    40  	d, err := zstd.NewReader(in)
    41  	if err != nil {
    42  		return err
    43  	}
    44  	defer d.Close()
    45  
    46  	_, err = io.Copy(out, d)
    47  	return err
    48  }
    49  
    50  func (z ZStdCompactor) UnCompressBytes(in []byte) (out []byte, err error) {
    51  	var outIO bytes.Buffer
    52  	err = z.UnCompress(bytes.NewReader(in), &outIO)
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  	return outIO.Bytes(), nil
    57  }
    58  
    59  func NewZStdCompactor() ICompactor {
    60  	return ZStdCompactor{}
    61  }