Skip to main content

hyperlit_database/
in_memory_database.rs

1use crate::Database;
2use hyperlit_base::err;
3use hyperlit_base::result::HyperlitResult;
4use hyperlit_model::segment::{Segment, SegmentId};
5
6#[derive(Debug, Default)]
7pub struct InMemoryDatabase {
8    pub segments: Vec<Segment>,
9}
10
11impl InMemoryDatabase {
12    pub fn new() -> Self {
13        Self::default()
14    }
15
16    fn get_mut_segment_by_id(&mut self, id: SegmentId) -> HyperlitResult<&mut Segment> {
17        self.segments
18            .get_mut(id as usize)
19            .ok_or_else(|| err!("Segment with id {} not found", id))
20    }
21}
22
23impl Database for InMemoryDatabase {
24    fn add_segments(&mut self, segments: Vec<Segment>) -> HyperlitResult<()> {
25        let old_len = self.segments.len();
26        self.segments.extend(segments);
27        let mut index = old_len as u32;
28        for segment in self.segments.iter_mut().skip(old_len) {
29            segment.id = index;
30            index += 1;
31        }
32        Ok(())
33    }
34
35    fn get_all_segments(&self) -> HyperlitResult<Vec<&Segment>> {
36        Ok(self.segments.iter().collect())
37    }
38
39    fn get_segment_by_id(&self, id: SegmentId) -> HyperlitResult<&Segment> {
40        self.segments
41            .get(id as usize)
42            .ok_or_else(|| err!("Segment with id {} not found", id))
43    }
44
45    fn set_segment_included(&mut self, id: SegmentId) -> HyperlitResult<()> {
46        self.get_mut_segment_by_id(id)?.is_included = true;
47        Ok(())
48    }
49}