conspire 0.7.1

The Rust interface to conspire.
Documentation
pub mod base;
pub mod iter;
pub mod polytopal;
pub mod primitive;

use crate::{
    geometry::mesh::connectivity::{
        polytopal::PolytopalConnectivity, primitive::PrimitiveConnectivity,
    },
    math::Set,
};

pub enum Connectivity {
    Hexahedral(PrimitiveConnectivity<3, 8>),
    Polyhedral(PolytopalConnectivity<3>),
    Polygonal(PolytopalConnectivity<2>),
    Pyramidal(PrimitiveConnectivity<3, 5>),
    Quadrilateral(PrimitiveConnectivity<2, 4>),
    Tetrahedral(PrimitiveConnectivity<3, 4>),
    Triangular(PrimitiveConnectivity<2, 3>),
    Wedge(PrimitiveConnectivity<3, 6>),
}

pub type Connectivities = Set<Vec<Connectivity>>;

macro_rules! try_from_connectivity {
    ($variant: ident, $m: literal, $n: literal, $error: literal) => {
        impl TryFrom<Connectivity> for PrimitiveConnectivity<$m, $n> {
            type Error = &'static str;
            fn try_from(connectivity: Connectivity) -> Result<Self, Self::Error> {
                match connectivity {
                    Connectivity::$variant(connectivity) => Ok(connectivity),
                    _ => Err($error),
                }
            }
        }
    };
}
try_from_connectivity!(Hexahedral, 3, 8, "block is not hexahedral");
try_from_connectivity!(Pyramidal, 3, 5, "block is not pyramidal");
try_from_connectivity!(Quadrilateral, 2, 4, "block is not quadrilateral");
try_from_connectivity!(Tetrahedral, 3, 4, "block is not tetrahedral");
try_from_connectivity!(Triangular, 2, 3, "block is not triangular");
try_from_connectivity!(Wedge, 3, 6, "block is not a wedge");

impl TryFrom<Connectivity> for PolytopalConnectivity<3> {
    type Error = &'static str;
    fn try_from(connectivity: Connectivity) -> Result<Self, Self::Error> {
        match connectivity {
            Connectivity::Polyhedral(connectivity) => Ok(connectivity),
            _ => Err("block is not polyhedral"),
        }
    }
}

impl TryFrom<Connectivity> for PolytopalConnectivity<2> {
    type Error = &'static str;
    fn try_from(connectivity: Connectivity) -> Result<Self, Self::Error> {
        match connectivity {
            Connectivity::Polygonal(connectivity) => Ok(connectivity),
            _ => Err("block is not polygonal"),
        }
    }
}