use crate::composition::Composition;
use crate::error::ProviderError;
use crate::literature_evidence::LiteratureRouteEvidence;
use crate::precursor::{PrecursorCandidate, PrecursorSelection};
use crate::process::{ProcessPrecedent, RouteFamily};
use crate::reaction::{BalancedReaction, CompetingPhase, ReactionEnergy, ThermodynamicConditions};
use crate::route_suitability::SuitabilityFinding;
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>;
}
pub trait RouteSuitabilityProvider {
fn assess(
&self,
target: &Composition,
route_family: RouteFamily,
) -> std::result::Result<Vec<SuitabilityFinding>, ProviderError>;
}
pub trait LiteratureEvidenceProvider {
fn route_evidence(
&self,
target: &Composition,
route_family: RouteFamily,
precursors: &[Composition],
) -> std::result::Result<Option<LiteratureRouteEvidence>, ProviderError>;
}