mod block_map;
mod extents_blocks;
use crate::block_index::FsBlockIndex;
use crate::inode::{Inode, InodeFlags};
use crate::{Ext4, Ext4Error};
use block_map::BlockMap;
use extents_blocks::ExtentsBlocks;
#[allow(clippy::large_enum_variant)]
enum FileBlocksInner {
ExtentsBlocks(ExtentsBlocks),
BlockMap(BlockMap),
}
pub(crate) struct FileBlocks(FileBlocksInner);
impl FileBlocks {
pub(crate) fn new(fs: Ext4, inode: &Inode) -> Result<Self, Ext4Error> {
if inode.flags.contains(InodeFlags::EXTENTS) {
Ok(Self(FileBlocksInner::ExtentsBlocks(ExtentsBlocks::new(
fs, inode,
)?)))
} else {
Ok(Self(FileBlocksInner::BlockMap(BlockMap::new(fs, inode))))
}
}
}
impl Iterator for FileBlocks {
type Item = Result<FsBlockIndex, Ext4Error>;
fn next(&mut self) -> Option<Result<FsBlockIndex, Ext4Error>> {
match self {
Self(FileBlocksInner::ExtentsBlocks(iter)) => iter.next(),
Self(FileBlocksInner::BlockMap(iter)) => iter.next(),
}
}
}