use std::fmt;
use crate::{StoichiometricCoefficient, StoichiometryValidationError};
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct StoichiometricRatio {
numerator: StoichiometricCoefficient,
denominator: StoichiometricCoefficient,
}
impl StoichiometricRatio {
pub const fn new(
numerator: StoichiometricCoefficient,
denominator: StoichiometricCoefficient,
) -> Result<Self, StoichiometryValidationError> {
if denominator.value() == 0 {
Err(StoichiometryValidationError::ZeroRatioDenominator)
} else {
Ok(Self {
numerator,
denominator,
})
}
}
pub const fn from_values(
numerator: u32,
denominator: u32,
) -> Result<Self, StoichiometryValidationError> {
if denominator == 0 {
return Err(StoichiometryValidationError::ZeroRatioDenominator);
}
let numerator = match StoichiometricCoefficient::new(numerator) {
Ok(numerator) => numerator,
Err(error) => return Err(error),
};
let denominator = match StoichiometricCoefficient::new(denominator) {
Ok(denominator) => denominator,
Err(error) => return Err(error),
};
Self::new(numerator, denominator)
}
#[must_use]
pub const fn numerator(self) -> StoichiometricCoefficient {
self.numerator
}
#[must_use]
pub const fn denominator(self) -> StoichiometricCoefficient {
self.denominator
}
}
impl fmt::Display for StoichiometricRatio {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "{}:{}", self.numerator, self.denominator)
}
}