If length is required, maybe consider a different interface like [`fs.File`](https://pkg.go.dev/io/fs#File) or you could declare an interface like ```go type LengthReader interface { io.Reader Len() int } ``` which is satisfied by `bytes.Buffer` and `strings.Reader` and provide a helper for `os.File/fs.File` like ```go type lr struct { fs.File } func (lr *r) Len() int { info, err := r.Stat() if err != nil { panic(err) // or ignore/log } return int(info.Size()) } // LengthReaderFromFile returns a LengthReader from an fs.File func LengthReaderFromFile(f fs.File) LengthReader { return &lr{f} } ``` _Originally posted by @micahhausler in https://github.com/bmc-toolbox/bmclib/pull/261#discussion_r856265780_