1/*2Maddy Mail Server - Composable all-in-one email server.3Copyright © 2019-2020 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors45This program is free software: you can redistribute it and/or modify6it under the terms of the GNU General Public License as published by7the Free Software Foundation, either version 3 of the License, or8(at your option) any later version.910This program is distributed in the hope that it will be useful,11but WITHOUT ANY WARRANTY; without even the implied warranty of12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13GNU General Public License for more details.1415You should have received a copy of the GNU General Public License16along with this program. If not, see <https://www.gnu.org/licenses/>.17*/1819package buffer2021import (22 "bytes"23)2425// BytesReader is a wrapper for bytes.Reader that stores the original []byte26// value and allows to retrieve it.27//28// It is meant for passing to libraries that expect a io.Reader29// but apply certain optimizations when the Reader implements30// Bytes() interface.31type BytesReader struct {32 *bytes.Reader33 value []byte34}3536// Bytes returns the unread portion of underlying slice used to construct37// BytesReader.38func (br BytesReader) Bytes() []byte {39 return br.value[int(br.Size())-br.Len():]40}4142// Copy returns the BytesReader reading from the same slice as br at the same43// position.44func (br BytesReader) Copy() BytesReader {45 return NewBytesReader(br.Bytes())46}4748// Close is a dummy method for implementation of io.Closer so BytesReader can49// be used in MemoryBuffer directly.50func (br BytesReader) Close() error {51 return nil52}5354func NewBytesReader(b []byte) BytesReader {55 // BytesReader and not *BytesReader because BytesReader already wraps two56 // pointers and double indirection would be pointless.57 return BytesReader{58 Reader: bytes.NewReader(b),59 value: b,60 }61}