Skip to main content

use_bond/
bond_order.rs

1use std::fmt;
2
3use crate::BondValidationError;
4
5/// A rational fractional bond order.
6#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
7pub struct FractionalBondOrder {
8    numerator: u32,
9    denominator: u32,
10}
11
12impl FractionalBondOrder {
13    /// Creates a fractional bond order.
14    ///
15    /// # Errors
16    ///
17    /// Returns [`BondValidationError::ZeroFractionalBondOrderNumerator`] when `numerator` is zero,
18    /// or [`BondValidationError::ZeroFractionalBondOrderDenominator`] when `denominator` is zero.
19    pub const fn new(numerator: u32, denominator: u32) -> Result<Self, BondValidationError> {
20        if numerator == 0 {
21            Err(BondValidationError::ZeroFractionalBondOrderNumerator)
22        } else if denominator == 0 {
23            Err(BondValidationError::ZeroFractionalBondOrderDenominator)
24        } else {
25            Ok(Self {
26                numerator,
27                denominator,
28            })
29        }
30    }
31
32    /// Returns the numerator.
33    #[must_use]
34    pub const fn numerator(self) -> u32 {
35        self.numerator
36    }
37
38    /// Returns the denominator.
39    #[must_use]
40    pub const fn denominator(self) -> u32 {
41        self.denominator
42    }
43}
44
45impl fmt::Display for FractionalBondOrder {
46    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
47        write!(formatter, "{}/{}", self.numerator, self.denominator)
48    }
49}
50
51/// A lightweight bond order label.
52#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
53pub enum BondOrder {
54    /// Single bond order.
55    Single,
56    /// Double bond order.
57    Double,
58    /// Triple bond order.
59    Triple,
60    /// Quadruple bond order.
61    Quadruple,
62    /// Aromatic bond order.
63    Aromatic,
64    /// Rational fractional bond order.
65    Fractional(FractionalBondOrder),
66    /// Unknown or intentionally unspecified bond order.
67    Unknown,
68}
69
70impl fmt::Display for BondOrder {
71    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
72        match self {
73            Self::Single => formatter.write_str("single"),
74            Self::Double => formatter.write_str("double"),
75            Self::Triple => formatter.write_str("triple"),
76            Self::Quadruple => formatter.write_str("quadruple"),
77            Self::Aromatic => formatter.write_str("aromatic"),
78            Self::Fractional(order) => write!(formatter, "{order}"),
79            Self::Unknown => formatter.write_str("unknown"),
80        }
81    }
82}