use crate::error::Result;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum LogReplayPolicy {
#[default]
Require,
Auto,
InMemoryOnReadOnly,
ReadOnlyNoReplay,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ReadSemanticsPolicy {
#[default]
EffectiveDataPreferred,
RawDataPreferred,
}
pub struct ParentRequest<'a> {
pub locator: crate::metadata::ParentLocator<'a>,
pub expected_data_write_guid: crate::types::Guid,
pub child_logical_sector_size: u32,
pub child_virtual_disk_size: u64,
}
impl ParentRequest<'_> {
#[must_use]
pub fn locator(&self) -> &crate::metadata::ParentLocator<'_> {
&self.locator
}
#[must_use]
pub fn child_logical_sector_size(&self) -> u32 {
self.child_logical_sector_size
}
#[must_use]
pub fn expected_data_write_guid(&self) -> crate::types::Guid {
self.expected_data_write_guid
}
#[must_use]
pub fn child_virtual_disk_size(&self) -> u64 {
self.child_virtual_disk_size
}
}
pub trait ParentMedium {
fn data_write_guid(&mut self) -> Result<crate::types::Guid>;
fn logical_sector_size(&mut self) -> Result<u32>;
fn read_sector(&mut self, sector: u64, buf: &mut [u8]) -> Result<()>;
}
impl<T> ParentMedium for std::cell::RefCell<T>
where
T: ParentMedium,
{
fn data_write_guid(&mut self) -> Result<crate::types::Guid> {
self.borrow_mut().data_write_guid()
}
fn logical_sector_size(&mut self) -> Result<u32> {
self.borrow_mut().logical_sector_size()
}
fn read_sector(&mut self, sector: u64, buf: &mut [u8]) -> Result<()> {
self.borrow_mut().read_sector(sector, buf)
}
}
pub trait ParentResolver {
fn resolve_parent(&mut self, request: ParentRequest<'_>) -> Result<Box<dyn ParentMedium>>;
}