github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/iokit/trigger.go (about)

     1  // Copyright 2020 Insolar Network Ltd.
     2  // All rights reserved.
     3  // This material is licensed under the Insolar License version 1.0,
     4  // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md.
     5  
     6  package iokit
     7  
     8  import "io"
     9  
    10  func LimitReaderWithTrigger(r io.Reader, n int64, triggerFn func(int64)) *LimitedTriggerReader {
    11  	return &LimitedTriggerReader{LimitedReader{TeeReader{R: r}, n}, triggerFn}
    12  }
    13  
    14  var _ io.ReadCloser = &LimitedTriggerReader{}
    15  
    16  type hLimitedReader = LimitedReader
    17  type LimitedTriggerReader struct {
    18  	hLimitedReader
    19  	t func(int64)
    20  }
    21  
    22  func (p *LimitedTriggerReader) Read(b []byte) (int, error) {
    23  	if p.hLimitedReader.n <= 0 {
    24  		return 0, io.ErrUnexpectedEOF
    25  	}
    26  	n, err := p.hLimitedReader.Read(b)
    27  	if p.hLimitedReader.n <= 0 {
    28  		p.trigger()
    29  	}
    30  	return n, err
    31  }
    32  
    33  func (p *LimitedTriggerReader) trigger() {
    34  	if p.t == nil {
    35  		return
    36  	}
    37  	//p.hLimitedReader.R.W = nil
    38  	t := p.t
    39  	p.t = nil
    40  	t(p.hLimitedReader.n)
    41  }
    42  
    43  func (p *LimitedTriggerReader) Close() error {
    44  	p.trigger()
    45  	return nil
    46  }