use crate::{block_read::BlockRead, dir::EntrySet, error::Result, fat::read_stream, vbr::Geometry};
pub(crate) fn read_at(
reader: &mut impl BlockRead,
geo: &Geometry,
es: &EntrySet,
off: u64,
buf: &mut [u8],
) -> Result<usize> {
if off >= es.data_length || buf.is_empty() {
return Ok(0);
}
let end = off.saturating_add(buf.len() as u64).min(es.data_length);
let total = (end - off) as usize;
let dst = &mut buf[..total];
let valid = core::cmp::min(es.valid_data_length, es.data_length);
if off >= valid {
dst.fill(0);
return Ok(total);
}
let read_end = core::cmp::min(end, valid);
let read_len = (read_end - off) as usize;
read_stream(
reader,
geo,
es.first_cluster,
es.contiguous,
off,
&mut dst[..read_len],
)?;
if read_len < total {
dst[read_len..].fill(0);
}
Ok(total)
}