use std::fmt;
use crate::BondValidationError;
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct FractionalBondOrder {
numerator: u32,
denominator: u32,
}
impl FractionalBondOrder {
pub const fn new(numerator: u32, denominator: u32) -> Result<Self, BondValidationError> {
if numerator == 0 {
Err(BondValidationError::ZeroFractionalBondOrderNumerator)
} else if denominator == 0 {
Err(BondValidationError::ZeroFractionalBondOrderDenominator)
} else {
Ok(Self {
numerator,
denominator,
})
}
}
#[must_use]
pub const fn numerator(self) -> u32 {
self.numerator
}
#[must_use]
pub const fn denominator(self) -> u32 {
self.denominator
}
}
impl fmt::Display for FractionalBondOrder {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "{}/{}", self.numerator, self.denominator)
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum BondOrder {
Single,
Double,
Triple,
Quadruple,
Aromatic,
Fractional(FractionalBondOrder),
Unknown,
}
impl fmt::Display for BondOrder {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Single => formatter.write_str("single"),
Self::Double => formatter.write_str("double"),
Self::Triple => formatter.write_str("triple"),
Self::Quadruple => formatter.write_str("quadruple"),
Self::Aromatic => formatter.write_str("aromatic"),
Self::Fractional(order) => write!(formatter, "{order}"),
Self::Unknown => formatter.write_str("unknown"),
}
}
}