flashdb_rs/tsdb/
reader.rs

1use embedded_storage::nor_flash::NorFlash;
2
3use crate::{Error, TSLEntry};
4
5use super::{TSDB,fdb_blob_make_by_tsl};
6
7pub struct TSDBReader<'a,S:NorFlash> {
8    position: usize,
9    inner: &'a mut TSDB<S>, // 使用原始指针
10    pub entry: TSLEntry,
11}
12
13impl<'a, S: NorFlash> TSDBReader<'a, S> {
14    pub fn new(tsdb: &'a mut TSDB<S>, entry: TSLEntry) -> Self {
15        return Self {
16            inner: tsdb,
17            entry: entry,
18            position: 0,
19        };
20    }
21}
22
23
24impl<'a,S:NorFlash> embedded_io::ErrorType for TSDBReader<'a,S> {
25    type Error = Error;
26}
27
28impl<'a,S:NorFlash> embedded_io::Read for TSDBReader<'a,S> {
29    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
30        let total_len = self.entry.inner.log_len as usize;
31        if self.position >= total_len {
32            return Ok(0); // EOF
33        }
34
35        // 安全:指针生命周期由迭代器保证
36        let mut blob = fdb_blob_make_by_tsl(buf, &self.entry, self.position);
37        let actual_read = self.inner.fdb_blob_read(&mut blob);
38        self.position += actual_read;
39        Ok(actual_read)
40    }
41}
42
43impl<'a,S:NorFlash> embedded_io::Seek for TSDBReader<'a,S> {
44    fn seek(&mut self, pos: embedded_io::SeekFrom) -> Result<u64, Self::Error> {
45        let total_len = self.entry.inner.log_len as usize;
46        let new_pos = match pos {
47            embedded_io::SeekFrom::Start(offset) => offset as usize,
48            embedded_io::SeekFrom::End(offset) => (total_len as i64 + offset) as usize,
49            embedded_io::SeekFrom::Current(offset) => (self.position as i64 + offset) as usize,
50        };
51
52        if new_pos > total_len {
53            return Err(Error::InvalidArgument);
54        }
55
56        self.position = new_pos;
57        Ok(new_pos as u64)
58    }
59}