Skip to main content

use_stoichiometry/
mole_ratio.rs

1use std::fmt;
2
3use crate::{StoichiometricCoefficient, StoichiometricRatio, StoichiometryValidationError};
4
5/// A mole ratio between two stoichiometric coefficients.
6#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
7pub struct MoleRatio(StoichiometricRatio);
8
9impl MoleRatio {
10    /// Creates a mole ratio from validated coefficients.
11    ///
12    /// # Errors
13    ///
14    /// Returns [`StoichiometryValidationError::ZeroRatioDenominator`] if the denominator
15    /// is structurally invalid.
16    pub fn new(
17        numerator: StoichiometricCoefficient,
18        denominator: StoichiometricCoefficient,
19    ) -> Result<Self, StoichiometryValidationError> {
20        Ok(Self(StoichiometricRatio::new(numerator, denominator)?))
21    }
22
23    /// Creates a mole ratio from raw coefficient values.
24    ///
25    /// # Errors
26    ///
27    /// Returns [`StoichiometryValidationError::ZeroRatioDenominator`] when `denominator`
28    /// is zero, or [`StoichiometryValidationError::ZeroCoefficient`] when `numerator` is
29    /// zero.
30    pub fn from_values(
31        numerator: u32,
32        denominator: u32,
33    ) -> Result<Self, StoichiometryValidationError> {
34        Ok(Self(StoichiometricRatio::from_values(
35            numerator,
36            denominator,
37        )?))
38    }
39
40    /// Returns the wrapped stoichiometric ratio.
41    #[must_use]
42    pub const fn as_ratio(self) -> StoichiometricRatio {
43        self.0
44    }
45
46    /// Returns the numerator coefficient.
47    #[must_use]
48    pub const fn numerator(self) -> StoichiometricCoefficient {
49        self.0.numerator()
50    }
51
52    /// Returns the denominator coefficient.
53    #[must_use]
54    pub const fn denominator(self) -> StoichiometricCoefficient {
55        self.0.denominator()
56    }
57}
58
59impl fmt::Display for MoleRatio {
60    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
61        write!(formatter, "{}", self.0)
62    }
63}