github.com/traefik/yaegi@v0.15.1/stdlib/wrapper-composed.go (about) 1 package stdlib 2 3 import ( 4 "bufio" 5 "io" 6 "net" 7 "net/http" 8 "reflect" 9 ) 10 11 // Wrappers for composed interfaces which trigger a special behavior in stdlib. 12 // Note: it may become useless to pre-compile composed interface wrappers 13 // once golang/go#15924 is resolved. 14 15 // In net/http, a ResponseWriter may also implement a Hijacker. 16 17 type _netHTTPResponseWriterHijacker struct { 18 IValue interface{} 19 WHeader func() http.Header 20 WWrite func(a0 []byte) (int, error) 21 WWriteHeader func(statusCode int) 22 23 WHijack func() (net.Conn, *bufio.ReadWriter, error) 24 } 25 26 func (w _netHTTPResponseWriterHijacker) Header() http.Header { 27 return w.WHeader() 28 } 29 30 func (w _netHTTPResponseWriterHijacker) Write(a0 []byte) (int, error) { 31 return w.WWrite(a0) 32 } 33 34 func (w _netHTTPResponseWriterHijacker) WriteHeader(statusCode int) { 35 w.WWriteHeader(statusCode) 36 } 37 38 func (w _netHTTPResponseWriterHijacker) Hijack() (net.Conn, *bufio.ReadWriter, error) { 39 return w.WHijack() 40 } 41 42 // In io, a Reader may implement WriteTo, used by io.Copy(). 43 44 type _ioReaderWriteTo struct { 45 IValue interface{} 46 WRead func(p []byte) (n int, err error) 47 48 WWriteTo func(w io.Writer) (n int64, err error) 49 } 50 51 func (w _ioReaderWriteTo) Read(p []byte) (n int, err error) { 52 return w.WRead(p) 53 } 54 55 func (w _ioReaderWriteTo) WriteTo(wr io.Writer) (n int64, err error) { 56 return w.WWriteTo(wr) 57 } 58 59 // In io, a Writer may implement ReadFrom, used by io.Copy(). 60 61 type _ioWriterReadFrom struct { 62 IValue interface{} 63 WWrite func(p []byte) (n int, err error) 64 65 WReadFrom func(r io.Reader) (n int64, err error) 66 } 67 68 func (w _ioWriterReadFrom) Write(p []byte) (n int, err error) { 69 return w.WWrite(p) 70 } 71 72 func (w _ioWriterReadFrom) ReadFrom(r io.Reader) (n int64, err error) { 73 return w.WReadFrom(r) 74 } 75 76 // Each MapType value (each slice) must be sorted by complexity, i.e. by number 77 // of interface methods. 78 func init() { 79 MapTypes[reflect.ValueOf((*_net_http_ResponseWriter)(nil))] = []reflect.Type{ 80 reflect.ValueOf((*_netHTTPResponseWriterHijacker)(nil)).Type().Elem(), 81 } 82 MapTypes[reflect.ValueOf((*_io_Reader)(nil))] = []reflect.Type{ 83 reflect.ValueOf((*_ioReaderWriteTo)(nil)).Type().Elem(), 84 } 85 MapTypes[reflect.ValueOf((*_io_Writer)(nil))] = []reflect.Type{ 86 reflect.ValueOf((*_ioWriterReadFrom)(nil)).Type().Elem(), 87 } 88 }