use crate::event::{ChainEvent, SystemEvent};
use crate::journal::journal_error::JournalError;
use crate::journal::journal_name::JournalName;
use crate::journal::journal_owner::JournalOwner;
use crate::journal::{Journal, RunManifest};
use std::fmt;
use std::path::{Path, PathBuf};
use std::sync::Arc;
use crate::journal::archive::ReplayArchive;
#[derive(Clone, Debug)]
pub enum RunSubstrateState {
Durable(CurrentRunLocator),
Ephemeral,
}
impl RunSubstrateState {
pub fn locator(&self) -> Option<&CurrentRunLocator> {
match self {
Self::Durable(locator) => Some(locator),
Self::Ephemeral => None,
}
}
}
#[derive(Clone, Debug)]
pub struct CurrentRunLocator(PathBuf);
impl CurrentRunLocator {
pub fn new(path: PathBuf) -> Self {
Self(path)
}
pub fn path(&self) -> &Path {
&self.0
}
}
impl fmt::Display for CurrentRunLocator {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.display().fmt(f)
}
}
pub struct RunResourcePlan {
pub stage_count: usize,
pub edge_count: usize,
pub metrics_enabled: bool,
}
pub trait FlowJournalFactory: Send {
fn run_state(&self) -> RunSubstrateState;
fn create_chain_journal(
&mut self,
name: JournalName,
owner: JournalOwner,
) -> Result<Arc<dyn Journal<ChainEvent>>, JournalError>;
fn create_system_journal(
&mut self,
name: JournalName,
owner: JournalOwner,
) -> Result<Arc<dyn Journal<SystemEvent>>, JournalError>;
fn resource_preflight(&self, _plan: &RunResourcePlan) -> Result<(), JournalError> {
Ok(())
}
fn write_run_manifest(&self, _manifest: &RunManifest) -> Result<(), JournalError> {
Ok(())
}
fn seed_admission_from_archive(&self, _archive: &dyn ReplayArchive) {}
}