graft_kernel/
graft_reader.rs

1use culprit::Culprit;
2use graft_core::{PageCount, PageIdx, VolumeId, page::Page};
3
4use crate::{KernelErr, graft_writer::GraftWriter, rt::runtime::Runtime, snapshot::Snapshot};
5
6/// A type which can read from a Graft
7pub trait GraftRead {
8    fn snapshot(&self) -> &Snapshot;
9    fn page_count(&self) -> culprit::Result<PageCount, KernelErr>;
10    fn read_page(&self, pageidx: PageIdx) -> culprit::Result<Page, KernelErr>;
11}
12
13#[derive(Debug, Clone)]
14pub struct GraftReader {
15    runtime: Runtime,
16    graft: VolumeId,
17    snapshot: Snapshot,
18}
19
20impl GraftReader {
21    pub(crate) fn new(runtime: Runtime, graft: VolumeId, snapshot: Snapshot) -> Self {
22        Self { runtime, graft, snapshot }
23    }
24}
25
26impl TryFrom<GraftReader> for GraftWriter {
27    type Error = Culprit<KernelErr>;
28
29    fn try_from(reader: GraftReader) -> Result<Self, Self::Error> {
30        let page_count = reader.page_count()?;
31        Ok(Self::new(
32            reader.runtime,
33            reader.graft,
34            reader.snapshot,
35            page_count,
36        ))
37    }
38}
39
40impl GraftRead for GraftReader {
41    fn snapshot(&self) -> &Snapshot {
42        &self.snapshot
43    }
44
45    fn page_count(&self) -> culprit::Result<PageCount, KernelErr> {
46        self.runtime.snapshot_pages(&self.snapshot)
47    }
48
49    fn read_page(&self, pageidx: PageIdx) -> culprit::Result<Page, KernelErr> {
50        self.runtime.read_page(&self.snapshot, pageidx)
51    }
52}