conspire 0.6.0

The Rust interface to conspire.
Documentation
//! Hybrid constitutive models.

mod elastic;
mod elastic_viscoplastic;
mod hyperelastic;
mod hyperelastic_viscoplastic;

pub use self::{
    elastic::{
        additive::ElasticAdditive,
        multiplicative::{ElasticMultiplicative, ElasticMultiplicativeViscoplastic},
    },
    elastic_viscoplastic::additive::{
        ElasticViscoplasticAdditiveElastic, ElasticViscoplasticAdditiveViscoplastic,
    },
};

use std::{
    any::type_name,
    fmt::{self, Debug, Formatter},
};

/// A hybrid constitutive model based on the additive decomposition.
#[derive(Clone)]
pub struct Additive<C1, C2>(C1, C2);

/// A hybrid constitutive model based on the multiplicative decomposition.
#[derive(Clone)]
pub struct Multiplicative<C1, C2>(C1, C2);

impl<C1, C2> Debug for Additive<C1, C2> {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(
            f,
            "Additive({}, {})",
            type_name::<C1>()
                .rsplit("::")
                .next()
                .unwrap()
                .split("<")
                .next()
                .unwrap(),
            type_name::<C2>()
                .rsplit("::")
                .next()
                .unwrap()
                .split("<")
                .next()
                .unwrap()
        )
    }
}

impl<C1, C2> Debug for Multiplicative<C1, C2> {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(
            f,
            "Multiplicative({}, {})",
            type_name::<C1>()
                .rsplit("::")
                .next()
                .unwrap()
                .split("<")
                .next()
                .unwrap(),
            type_name::<C2>()
                .rsplit("::")
                .next()
                .unwrap()
                .split("<")
                .next()
                .unwrap()
        )
    }
}