use crate::db::access::{
AccessCapabilities,
execution_contract::{
ExecutableAccessPath, ExecutableAccessPlan, summary::summarize_executable_access_plan,
},
lowering::lower_executable_access_plan,
plan::AccessPlan,
};
use std::fmt;
#[derive(Clone, Eq, PartialEq)]
pub(in crate::db) struct AccessStrategy<'a, K> {
executable: ExecutableAccessPlan<'a, K>,
capabilities: AccessCapabilities,
}
impl<'a, K> AccessStrategy<'a, K> {
#[must_use]
pub(in crate::db) fn from_plan(plan: &'a AccessPlan<K>) -> Self {
let executable = lower_executable_access_plan(plan);
Self::from_executable(executable)
}
#[must_use]
pub(in crate::db) fn from_executable(executable: ExecutableAccessPlan<'a, K>) -> Self {
let capabilities = executable.capabilities();
Self {
executable,
capabilities,
}
}
#[must_use]
pub(in crate::db) const fn executable(&self) -> &ExecutableAccessPlan<'a, K> {
&self.executable
}
#[must_use]
pub(in crate::db) fn into_executable(self) -> ExecutableAccessPlan<'a, K> {
self.executable
}
#[must_use]
pub(in crate::db) const fn capabilities(&self) -> AccessCapabilities {
self.capabilities
}
#[must_use]
pub(in crate::db) const fn as_path(&self) -> Option<&ExecutableAccessPath<'a, K>> {
self.executable.as_path()
}
}
impl<K> AccessStrategy<'_, K>
where
K: fmt::Debug,
{
#[must_use]
pub(in crate::db) fn debug_summary(&self) -> String {
summarize_executable_access_plan(&self.executable)
}
}
impl<K> fmt::Debug for AccessStrategy<'_, K>
where
K: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("AccessStrategy")
.field("summary", &self.debug_summary())
.field("capabilities", &self.capabilities)
.finish()
}
}