keramics_core/
data_stream.rs1use std::io::SeekFrom;
15use std::sync::{Arc, RwLock};
16
17use super::errors::ErrorTrace;
18
19pub type DataStreamReference = Arc<RwLock<dyn DataStream>>;
20
21pub trait DataStream: Send + Sync {
23 fn get_size(&mut self) -> Result<u64, ErrorTrace>;
25
26 fn read(&mut self, buf: &mut [u8]) -> Result<usize, ErrorTrace>;
28
29 #[inline(always)]
31 fn read_at_position(&mut self, buf: &mut [u8], pos: SeekFrom) -> Result<usize, ErrorTrace> {
32 self.seek(pos)?;
33 self.read(buf)
34 }
35
36 #[inline(always)]
38 fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), ErrorTrace> {
39 let read_size: usize = buf.len();
40 let read_count: usize = self.read(buf)?;
41
42 if read_count != read_size {
43 return Err(crate::error_trace_new!("Unable to read the exact amount"));
44 }
45 Ok(())
46 }
47
48 #[inline(always)]
50 fn read_exact_at_position(&mut self, buf: &mut [u8], pos: SeekFrom) -> Result<u64, ErrorTrace> {
51 let offset: u64 = self.seek(pos)?;
52 let read_size: usize = buf.len();
53 let read_count: usize = self.read(buf)?;
54
55 if read_count != read_size {
56 return Err(crate::error_trace_new!("Unable to read the exact amount"));
57 }
58 Ok(offset)
59 }
60
61 fn seek(&mut self, pos: SeekFrom) -> Result<u64, ErrorTrace>;
63}