github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/gnovm/tests/backup/issue_558.gno (about)

     1  package main
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io"
     7  	"io"
     8  	"log"
     9  	"strings"
    10  )
    11  
    12  type readAutoCloser struct {
    13  	r io.ReadCloser
    14  }
    15  
    16  func (a readAutoCloser) Read(b []byte) (n int, err error) {
    17  	if a.r == nil {
    18  		return 0, io.EOF
    19  	}
    20  	n, err = a.r.Read(b)
    21  	if errors.Is(err, io.EOF) {
    22  		a.Close()
    23  	}
    24  	return n, err
    25  }
    26  
    27  func (a readAutoCloser) Close() error {
    28  	if a.r == nil {
    29  		return nil
    30  	}
    31  	return a.r.(io.Closer).Close()
    32  }
    33  
    34  type pipe struct {
    35  	Reader readAutoCloser
    36  }
    37  
    38  func newReadAutoCloser(r io.Reader) readAutoCloser {
    39  	if _, ok := r.(io.Closer); !ok {
    40  		return readAutoCloser{io.NopCloser(r)}
    41  	}
    42  	return readAutoCloser{r.(io.ReadCloser)}
    43  }
    44  
    45  func main() {
    46  	p := &pipe{}
    47  	p.Reader = newReadAutoCloser(strings.NewReader("test"))
    48  	b, err := io.ReadAll(p.Reader)
    49  	if err != nil {
    50  		log.Fatal(err)
    51  	}
    52  	fmt.Println(string(b))
    53  }
    54  
    55  // Output:
    56  // test