use crate::history::{
cohort::TemporalCohort,
epoch::{EpochTag, MaterializationSafety},
identity::{ArtifactRef, IdentityDiscipline},
};
pub type SourceId = String;
#[derive(Debug, Clone)]
pub struct CohortQuery {
pub artifact: Option<ArtifactRef>,
pub discipline: Option<IdentityDiscipline>,
}
impl CohortQuery {
#[must_use]
pub fn all() -> Self {
Self {
artifact: None,
discipline: None,
}
}
}
pub struct WorkingCopy {
pub path: std::path::PathBuf,
}
pub struct Evidence {
pub path: std::path::PathBuf,
}
pub trait HistoricalSource {
type Handle;
fn id(&self) -> SourceId;
fn supported_disciplines(&self) -> &'static [IdentityDiscipline];
fn enumerate(&self, query: &CohortQuery) -> impl Iterator<Item = TemporalCohort<Self::Handle>>;
fn acquisition_protocol(&self) -> &dyn AcquisitionProtocol;
}
pub trait AcquisitionProtocol {
fn preconditions(&self) -> Vec<String>;
fn forbidden_operations(&self) -> Vec<&'static str>;
fn required_companion_artifacts(&self) -> Vec<String>;
fn destructive_if_skipped(&self) -> Vec<&'static str>;
}
pub trait StateMaterializer {
fn safety(&self) -> MaterializationSafety;
fn materialize<'a>(
&'a self,
epoch: EpochTag,
ev: &'a Evidence,
) -> Result<std::path::PathBuf, String>;
fn materialize_via_working_copy(
&self,
epoch: EpochTag,
wc: &mut WorkingCopy,
) -> Result<std::path::PathBuf, String>;
}