conventus 0.3.0

Traits for assembling and disassembling items
Documentation
use {
    conventus::{AssembleFailure, AssembleFrom, AssembleInto, DisassembleFrom, DisassembleInto},
    fehler::{throw, throws},
};

#[derive(Clone, Debug, PartialEq)]
struct Part(u8);

#[derive(Clone, Debug, PartialEq)]
struct Composite {
    first: Part,
    second: Part,
}

impl AssembleFrom<Part> for Composite {
    type Error = ();

    #[throws(AssembleFailure<Self::Error>)]
    fn assemble_from(components: &mut Vec<Part>) -> Self {
        if components.len() >= 2 {
            Self {
                first: components.remove(0),
                second: components.remove(0),
            }
        } else {
            throw!(());
        }
    }
}

impl DisassembleFrom<Composite> for Part {
    type Error = ();

    #[throws(Self::Error)]
    fn disassemble_from(composite: Composite) -> Vec<Self> {
        vec![composite.first, composite.second]
    }
}

#[test]
fn assemble_into() {
    let mut parts = vec![Part(1), Part(2)];

    assert_eq!(
        Composite::assemble_from(&mut parts.clone()),
        Part::assemble_into(&mut parts)
    );
}

#[test]
fn disassemble_into() {
    let composite = Composite {
        first: Part(1),
        second: Part(2),
    };

    assert_eq!(
        Part::disassemble_from(composite.clone()),
        composite.disassemble_into()
    );
}