use crate::composition::Composition;
use crate::error::ProviderError;
use crate::precursor::{PrecursorCandidate, PrecursorSelection};
use crate::process::ProcessPrecedent;
use crate::reaction::{BalancedReaction, CompetingPhase, ReactionEnergy, ThermodynamicConditions};
use crate::target::{PlanningConstraints, TargetSpecification};
pub trait PrecursorCatalog {
fn candidates_for(
&self,
target: &Composition,
constraints: &PlanningConstraints,
) -> std::result::Result<Vec<PrecursorCandidate>, ProviderError>;
}
pub trait ThermodynamicProvider {
fn reaction_energy(
&self,
reaction: &BalancedReaction,
conditions: &ThermodynamicConditions,
) -> std::result::Result<Option<ReactionEnergy>, ProviderError>;
fn competing_phases(
&self,
_target: &Composition,
) -> std::result::Result<Vec<CompetingPhase>, ProviderError> {
Ok(Vec::new())
}
}
pub trait ProcessEvidenceProvider {
fn precedents(
&self,
target: &TargetSpecification,
precursors: &[PrecursorSelection],
) -> std::result::Result<Vec<ProcessPrecedent>, ProviderError>;
}