graft_kernel/
graft_reader.rs1use culprit::Culprit;
2use graft_core::{PageCount, PageIdx, VolumeId, page::Page};
3
4use crate::{KernelErr, graft_writer::GraftWriter, rt::runtime::Runtime, snapshot::Snapshot};
5
6pub 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}