github.com/grailbio/base@v0.0.11/ioctx/std.go (about) 1 package ioctx 2 3 import ( 4 "context" 5 "io" 6 ) 7 8 type ( 9 fromStdReader struct{ io.Reader } 10 fromStdWriter struct{ io.Writer } 11 fromStdCloser struct{ io.Closer } 12 fromStdSeeker struct{ io.Seeker } 13 fromStdReaderAt struct{ io.ReaderAt } 14 fromStdWriterAt struct{ io.WriterAt } 15 16 StdReader struct { 17 Ctx context.Context 18 Reader 19 } 20 StdWriter struct { 21 Ctx context.Context 22 Writer 23 } 24 StdCloser struct { 25 Ctx context.Context 26 Closer 27 } 28 StdSeeker struct { 29 Ctx context.Context 30 Seeker 31 } 32 StdReadCloser struct { 33 Ctx context.Context 34 ReadCloser 35 } 36 StdReaderAt struct { 37 Ctx context.Context 38 ReaderAt 39 } 40 StdWriterAt struct { 41 Ctx context.Context 42 WriterAt 43 } 44 ) 45 46 // FromStdReader wraps io.Reader as Reader. 47 func FromStdReader(r io.Reader) Reader { return fromStdReader{r} } 48 49 func (r fromStdReader) Read(_ context.Context, dst []byte) (n int, err error) { 50 return r.Reader.Read(dst) 51 } 52 53 // FromStdWriter wraps io.Writer as Writer. 54 func FromStdWriter(w io.Writer) Writer { return fromStdWriter{w} } 55 56 func (w fromStdWriter) Write(_ context.Context, p []byte) (n int, err error) { 57 return w.Writer.Write(p) 58 } 59 60 // FromStdCloser wraps io.Closer as Closer. 61 func FromStdCloser(c io.Closer) Closer { return fromStdCloser{c} } 62 63 func (c fromStdCloser) Close(context.Context) error { return c.Closer.Close() } 64 65 // FromStdSeeker wraps io.Seeker as Seeker. 66 func FromStdSeeker(s io.Seeker) Seeker { return fromStdSeeker{s} } 67 68 func (s fromStdSeeker) Seek(_ context.Context, offset int64, whence int) (int64, error) { 69 return s.Seeker.Seek(offset, whence) 70 } 71 72 // FromStdReadCloser wraps io.ReadCloser as ReadCloser. 73 func FromStdReadCloser(rc io.ReadCloser) ReadCloser { 74 return struct { 75 Reader 76 Closer 77 }{FromStdReader(rc), FromStdCloser(rc)} 78 } 79 80 // FromStdReadSeeker wraps io.ReadSeeker as ReadSeeker. 81 func FromStdReadSeeker(rs io.ReadSeeker) ReadSeeker { 82 return struct { 83 Reader 84 Seeker 85 }{FromStdReader(rs), FromStdSeeker(rs)} 86 } 87 88 // FromStdReaderAt wraps io.ReaderAt as ReaderAt. 89 func FromStdReaderAt(r io.ReaderAt) ReaderAt { return fromStdReaderAt{r} } 90 91 func (r fromStdReaderAt) ReadAt(_ context.Context, dst []byte, off int64) (n int, err error) { 92 return r.ReaderAt.ReadAt(dst, off) 93 } 94 95 // ToStdReader wraps Reader as io.Reader. 96 func ToStdReader(ctx context.Context, r Reader) io.Reader { return StdReader{ctx, r} } 97 98 func (r StdReader) Read(dst []byte) (n int, err error) { 99 return r.Reader.Read(r.Ctx, dst) 100 } 101 102 // ToStdWriter wraps Writer as io.Writer. 103 func ToStdWriter(ctx context.Context, w Writer) io.Writer { return StdWriter{ctx, w} } 104 105 func (w StdWriter) Write(p []byte) (n int, err error) { 106 return w.Writer.Write(w.Ctx, p) 107 } 108 109 // ToStdCloser wraps Closer as io.Closer. 110 func ToStdCloser(ctx context.Context, c Closer) io.Closer { return StdCloser{ctx, c} } 111 112 func (c StdCloser) Close() error { 113 return c.Closer.Close(c.Ctx) 114 } 115 116 // ToStdSeeker wraps Seeker as io.Seeker. 117 func ToStdSeeker(ctx context.Context, s Seeker) io.Seeker { return StdSeeker{ctx, s} } 118 119 func (r StdSeeker) Seek(offset int64, whence int) (int64, error) { 120 return r.Seeker.Seek(r.Ctx, offset, whence) 121 } 122 123 // ToStdReadCloser wraps ReadCloser as io.ReadCloser. 124 func ToStdReadCloser(ctx context.Context, rc ReadCloser) io.ReadCloser { 125 return struct { 126 io.Reader 127 io.Closer 128 }{ToStdReader(ctx, rc), ToStdCloser(ctx, rc)} 129 } 130 131 // ToStdReadSeeker wraps ReadSeeker as io.ReadSeeker. 132 func ToStdReadSeeker(ctx context.Context, rs ReadSeeker) io.ReadSeeker { 133 return struct { 134 io.Reader 135 io.Seeker 136 }{ToStdReader(ctx, rs), ToStdSeeker(ctx, rs)} 137 } 138 139 // ToStdReaderAt wraps ReaderAt as io.ReaderAt. 140 func ToStdReaderAt(ctx context.Context, r ReaderAt) io.ReaderAt { return StdReaderAt{ctx, r} } 141 142 func (r StdReaderAt) ReadAt(dst []byte, off int64) (n int, err error) { 143 return r.ReaderAt.ReadAt(r.Ctx, dst, off) 144 } 145 146 // ToStdWriterAt wraps WriterAt as io.WriterAt. 147 func ToStdWriterAt(ctx context.Context, w WriterAt) io.WriterAt { return StdWriterAt{ctx, w} } 148 149 func (w StdWriterAt) WriteAt(dst []byte, off int64) (n int, err error) { 150 return w.WriterAt.WriteAt(w.Ctx, dst, off) 151 }