flashdb_rs/kvdb/
reader.rs1use crate::{fdb_blob_make_by, fdb_blob_read, Error, RawHandle};
2use embedded_storage::nor_flash::NorFlash;
3
4use super::{KVEntry, KVDB};
5
6pub struct KVReader<'a, S: NorFlash> {
11 position: usize, inner: &'a mut KVDB<S>, pub entry: KVEntry, }
15
16impl<'a, S: NorFlash> KVReader<'a, S> {
17 pub fn new(kvdb: &'a mut KVDB<S>, entry: KVEntry) -> Self {
18 return Self {
19 inner: kvdb,
20 entry: entry,
21 position: 0,
22 };
23 }
24}
25
26impl<'a, S: NorFlash> embedded_io::ErrorType for KVReader<'a, S> {
27 type Error = Error;
28}
29
30impl<'a, S: NorFlash> embedded_io::Read for KVReader<'a, S> {
31 fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
39 if self.position >= self.entry.value_len() {
40 return Ok(0); }
42 let mut blob = fdb_blob_make_by(buf, &self.entry, self.position);
43 let read_len = unsafe { fdb_blob_read(self.inner.handle() as *mut _, &mut blob) };
44 self.position += read_len;
45 Ok(read_len)
46 }
47}
48
49impl<'a, S: NorFlash> embedded_io::Seek for KVReader<'a, S> {
50 fn seek(&mut self, pos: embedded_io::SeekFrom) -> Result<u64, Self::Error> {
58 let total_len = self.entry.value_len();
59 let new_pos = match pos {
61 embedded_io::SeekFrom::Start(offset) => offset as usize,
62 embedded_io::SeekFrom::End(offset) => (total_len as i64 + offset) as usize,
63 embedded_io::SeekFrom::Current(offset) => (self.position as i64 + offset) as usize,
64 };
65
66 if new_pos > total_len {
68 return Err(Error::InvalidArgument);
69 }
70
71 self.position = new_pos;
72 Ok(new_pos as u64)
73 }
74}