|
- package io
-
- import "io"
-
- type PromiseWriteCloser[T any] interface {
- io.Writer
- Abort(err error) // 中断发送文件
- Finish() (T, error) // 发送文件完成,等待返回结果
- }
-
- func WriteAll(writer io.Writer, data []byte) error {
- pos := 0
- dataLen := len(data)
-
- for pos < dataLen {
- writeLen, err := writer.Write(data[pos:])
- if err != nil {
- return err
- }
-
- pos += writeLen
- }
-
- return nil
- }
-
- type readCloserHook struct {
- readCloser io.ReadCloser
- callback func(closer io.ReadCloser)
- isBefore bool // callback调用时机,true则在closer的Close之前调用
- }
-
- func (hook *readCloserHook) Read(buf []byte) (n int, err error) {
- return hook.readCloser.Read(buf)
- }
-
- func (hook *readCloserHook) Close() error {
- if hook.isBefore {
- hook.callback(hook.readCloser)
- }
-
- err := hook.readCloser.Close()
-
- if !hook.isBefore {
- hook.callback(hook.readCloser)
- }
- return err
- }
-
- func BeforeReadClosing(closer io.ReadCloser, callback func(closer io.ReadCloser)) io.ReadCloser {
- return &readCloserHook{
- readCloser: closer,
- callback: callback,
- isBefore: true,
- }
- }
-
- func AfterReadClosed(closer io.ReadCloser, callback func(closer io.ReadCloser)) io.ReadCloser {
- return &readCloserHook{
- readCloser: closer,
- callback: callback,
- isBefore: false,
- }
- }
|