1use std::fmt;
2
3use crate::BondValidationError;
4
5#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
7pub struct FractionalBondOrder {
8 numerator: u32,
9 denominator: u32,
10}
11
12impl FractionalBondOrder {
13 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 #[must_use]
34 pub const fn numerator(self) -> u32 {
35 self.numerator
36 }
37
38 #[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#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
53pub enum BondOrder {
54 Single,
56 Double,
58 Triple,
60 Quadruple,
62 Aromatic,
64 Fractional(FractionalBondOrder),
66 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}