ferroui_base/rendering/composition/drawing/
render_data_reader.rs1use super::{IRenderDataPayload, RenderDataOpcode};
2use crate::rendering::composition::transport::{BatchValue, BatchValueReader};
3
4#[derive(Clone, Copy, Debug)]
7pub struct RenderDataReader<'a> {
8 buffer: &'a [u8],
9 position: usize,
10}
11
12impl<'a> RenderDataReader<'a> {
13 pub fn new(buffer: &'a [u8]) -> Self {
14 Self { buffer, position: 0 }
15 }
16
17 pub fn position(&self) -> usize {
19 self.position
20 }
21
22 pub fn is_at_end(&self) -> bool {
24 self.position >= self.buffer.len()
25 }
26
27 pub fn take(&mut self, count: usize) -> &'a [u8] {
29 let span = &self.buffer[self.position..self.position + count];
30 self.position += count;
31 span
32 }
33
34 pub fn read<T: BatchValue>(&mut self) -> T {
36 T::read_from(&mut BatchValueReader::new(self.buffer, &mut self.position))
37 }
38
39 pub fn peek<T: BatchValue>(&self) -> T {
41 let mut position = self.position;
42 T::read_from(&mut BatchValueReader::new(self.buffer, &mut position))
43 }
44
45 pub fn read_payload<T: IRenderDataPayload>(&mut self) -> T {
47 let opcode = self.read::<RenderDataOpcode>();
48 debug_assert_eq!(opcode, T::OPCODE);
49 self.read::<T>()
50 }
51}