flashdb_rs/tsdb/
reader.rs1use 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>, 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); }
34
35 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}