github.com/traefik/yaegi@v0.15.1/_test/issue-558.go (about)

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