yowl 0.1.0

Primitives for reading and writing the SMILES language
Documentation
use crate::feature::BondKind;

pub fn reconcile(left: BondKind, right: &BondKind) -> Option<(BondKind, BondKind)> {
    use BondKind::{Down, Elided, Up};
    match (&left, &right) {
        (Up, Up) | (Down, Down) => None,
        (Up, Down) | (Down, Up) => Some((left, *right)),
        (Elided, Elided) => Some((Elided, Elided)),
        (Elided, Up) | (Down, Elided) => Some((Down, Up)),
        (Elided, Down) | (Up, Elided) => Some((Up, Down)),
        (other, Elided) | (Elided, &other) => Some((*other, *other)),
        (a, b) if a == *b => Some((*a, **b)),
        _ => None,
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use pretty_assertions::assert_eq;

    #[test]
    fn single_double() {
        assert_eq!(reconcile(BondKind::Single, &BondKind::Double), None)
    }

    #[test]
    fn up_up() {
        assert_eq!(reconcile(BondKind::Up, &BondKind::Up), None)
    }

    #[test]
    fn down_down() {
        assert_eq!(reconcile(BondKind::Down, &BondKind::Down), None)
    }

    #[test]
    fn elided_elided() {
        assert_eq!(
            reconcile(BondKind::Elided, &BondKind::Elided),
            Some((BondKind::Elided, BondKind::Elided))
        )
    }

    #[test]
    fn elided_single() {
        assert_eq!(
            reconcile(BondKind::Elided, &BondKind::Single),
            Some((BondKind::Single, BondKind::Single))
        )
    }

    #[test]
    fn elided_up() {
        assert_eq!(
            reconcile(BondKind::Elided, &BondKind::Up),
            Some((BondKind::Down, BondKind::Up))
        )
    }

    #[test]
    fn elided_down() {
        assert_eq!(
            reconcile(BondKind::Elided, &BondKind::Down),
            Some((BondKind::Up, BondKind::Down))
        )
    }

    #[test]
    fn up_elided() {
        assert_eq!(
            reconcile(BondKind::Up, &BondKind::Elided),
            Some((BondKind::Up, BondKind::Down))
        )
    }

    #[test]
    fn down_elided() {
        assert_eq!(
            reconcile(BondKind::Down, &BondKind::Elided),
            Some((BondKind::Down, BondKind::Up))
        )
    }

    #[test]
    fn up_down() {
        assert_eq!(
            reconcile(BondKind::Up, &BondKind::Down),
            Some((BondKind::Up, BondKind::Down))
        )
    }

    #[test]
    fn down_up() {
        assert_eq!(
            reconcile(BondKind::Down, &BondKind::Up),
            Some((BondKind::Down, BondKind::Up))
        )
    }

    #[test]
    fn single_elided() {
        assert_eq!(
            reconcile(BondKind::Single, &BondKind::Elided),
            Some((BondKind::Single, BondKind::Single))
        )
    }

    #[test]
    fn other_bonds() {
        assert_eq!(
            reconcile(BondKind::Triple, &BondKind::Triple),
            Some((BondKind::Triple, BondKind::Triple))
        )
    }
}