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