github.com/Mrs4s/MiraiGo@v0.0.0-20240226124653-54bdd873e3fe/utils/sys.go (about)

     1  package utils
     2  
     3  import (
     4  	"crypto/md5"
     5  	"errors"
     6  	"io"
     7  )
     8  
     9  type multiReadSeeker struct {
    10  	readers     []io.ReadSeeker
    11  	multiReader io.Reader
    12  }
    13  
    14  func ComputeMd5AndLength(r io.Reader) ([]byte, int64) {
    15  	h := md5.New()
    16  	length, _ := io.Copy(h, r)
    17  	fh := h.Sum(nil)
    18  	return fh, length
    19  }
    20  
    21  func (r *multiReadSeeker) Read(p []byte) (int, error) {
    22  	if r.multiReader == nil {
    23  		readers := make([]io.Reader, len(r.readers))
    24  		for i := range r.readers {
    25  			_, _ = r.readers[i].Seek(0, io.SeekStart)
    26  			readers[i] = r.readers[i]
    27  		}
    28  		r.multiReader = io.MultiReader(readers...)
    29  	}
    30  	return r.multiReader.Read(p)
    31  }
    32  
    33  func (r *multiReadSeeker) Seek(offset int64, whence int) (int64, error) {
    34  	if whence != 0 || offset != 0 {
    35  		return -1, errors.New("unsupported offset")
    36  	}
    37  	r.multiReader = nil
    38  	return 0, nil
    39  }
    40  
    41  func MultiReadSeeker(r ...io.ReadSeeker) io.ReadSeeker {
    42  	return &multiReadSeeker{
    43  		readers: r,
    44  	}
    45  }
    46  
    47  // Select 如果A为nil 将会返回 B 否则返回A
    48  // 对应 ?? 语法
    49  func Select(a, b []byte) []byte {
    50  	if a == nil {
    51  		return b
    52  	}
    53  	return a
    54  }