use std::fmt;
use use_chemical_formula::ChemicalFormula;
use crate::{StoichiometricCoefficient, StoichiometricTerm, StoichiometryValidationError};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct FormulaQuantity {
term: StoichiometricTerm,
}
impl FormulaQuantity {
pub fn new(
coefficient: StoichiometricCoefficient,
formula: ChemicalFormula,
) -> Result<Self, StoichiometryValidationError> {
Ok(Self {
term: StoichiometricTerm::new(coefficient, formula)?,
})
}
pub fn from_value(
coefficient: u32,
formula: ChemicalFormula,
) -> Result<Self, StoichiometryValidationError> {
Self::new(StoichiometricCoefficient::new(coefficient)?, formula)
}
#[must_use]
pub const fn coefficient(&self) -> StoichiometricCoefficient {
self.term.coefficient()
}
#[must_use]
pub const fn formula(&self) -> &ChemicalFormula {
self.term.formula()
}
#[must_use]
pub const fn term(&self) -> &StoichiometricTerm {
&self.term
}
#[must_use]
pub fn into_parts(self) -> (StoichiometricCoefficient, ChemicalFormula) {
self.term.into_parts()
}
}
impl fmt::Display for FormulaQuantity {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "{}", self.term)
}
}