use std::io;
use std::ops::RangeBounds;
pub use self::prefix_iter::{PrefixIter, RevPrefixIter};
pub use self::range_iter::{RangeIter, RevRangeIter};
pub use self::reader_cursor::ReaderCursor;
use crate::block::{Block, BlockCursor};
use crate::metadata::{FileVersion, Metadata};
use crate::{CompressionType, Error};
mod prefix_iter;
mod range_iter;
mod reader_cursor;
#[derive(Clone)]
pub struct Reader<R> {
metadata: Metadata,
reader: R,
}
impl<R: io::Read + io::Seek> Reader<R> {
pub fn new(mut reader: R) -> Result<Reader<R>, Error> {
Metadata::read_from(&mut reader).map(|metadata| Reader { metadata, reader })
}
pub fn into_cursor(self) -> Result<ReaderCursor<R>, Error> {
ReaderCursor::new(self)
}
pub fn into_prefix_iter(self, prefix: Vec<u8>) -> Result<PrefixIter<R>, Error> {
self.into_cursor().map(|cursor| PrefixIter::new(cursor, prefix))
}
pub fn into_rev_prefix_iter(self, prefix: Vec<u8>) -> Result<RevPrefixIter<R>, Error> {
self.into_cursor().map(|cursor| RevPrefixIter::new(cursor, prefix))
}
pub fn into_range_iter<S, A>(self, range: S) -> Result<RangeIter<R>, Error>
where
S: RangeBounds<A>,
A: AsRef<[u8]>,
{
self.into_cursor().map(|cursor| RangeIter::new(cursor, range))
}
pub fn into_rev_range_iter<S, A>(self, range: S) -> Result<RevRangeIter<R>, Error>
where
S: RangeBounds<A>,
A: AsRef<[u8]>,
{
self.into_cursor().map(|cursor| RevRangeIter::new(cursor, range))
}
}
impl<R> Reader<R> {
pub fn file_version(&self) -> FileVersion {
self.metadata.file_version
}
pub fn compression_type(&self) -> CompressionType {
self.metadata.compression_type
}
pub fn len(&self) -> u64 {
self.metadata.entries_count
}
pub(crate) fn index_block_offset(&self) -> u64 {
self.metadata.index_block_offset
}
pub(crate) fn index_levels(&self) -> u8 {
self.metadata.index_levels
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn into_inner(self) -> R {
self.reader
}
pub fn get_ref(&self) -> &R {
&self.reader
}
}