use crate::composition::{Composition, Element};
use std::collections::BTreeSet;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TargetStructure {
pub description: String,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhaseRequirement {
pub phase_name: String,
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PlanningConstraints {
pub forbidden_elements: BTreeSet<Element>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TargetSpecification {
pub composition: Composition,
pub structure: Option<TargetStructure>,
pub desired_phase: Option<PhaseRequirement>,
pub constraints: PlanningConstraints,
}
pub trait TargetMaterialView {
fn composition(&self) -> &Composition;
fn structure_metadata(&self) -> Option<&TargetStructure>;
}
impl TargetMaterialView for TargetSpecification {
fn composition(&self) -> &Composition {
&self.composition
}
fn structure_metadata(&self) -> Option<&TargetStructure> {
self.structure.as_ref()
}
}