model-mapper 0.7.1

Derive macro to map between different types
Documentation
#![allow(dead_code)]

use model_mapper::Mapper;

#[derive(Debug, Clone, PartialEq, Eq)]
struct FooTuple(String, bool);

#[derive(Mapper)]
#[mapper(from, into, ty = FooTuple)]
struct BarTuple(String, bool);

#[derive(Debug, Clone, PartialEq, Eq)]
struct FooNamed {
    field1: String,
    field2: bool,
}

#[derive(Mapper)]
#[mapper(from, into, ty = FooNamed)]
struct BarNamed {
    field1: String,
    field2: bool,
}

#[derive(Debug, Clone, PartialEq, Eq)]
enum FooEnumSimple {
    One,
    Two,
    Three,
}

#[derive(Mapper)]
#[mapper(from, into, ty = FooEnumSimple)]
enum BarEnumSimple {
    One,
    Two,
    Three,
}

#[derive(Debug, Clone, PartialEq, Eq)]
enum FooEnumComplex {
    One,
    Two(i32, FooTuple),
    Three { field1: String, field2: bool },
}

#[derive(Mapper)]
#[mapper(from, into, ty = FooEnumComplex)]
enum BarEnumComplex {
    One,
    Two(i32, BarTuple),
    Three { field1: String, field2: bool },
}

fn main() {
    let source = FooEnumComplex::Two(1, FooTuple("val".to_owned(), true));
    let bar = BarEnumComplex::from(source.clone());
    let mapped: FooEnumComplex = bar.into();

    assert_eq!(source, mapped);
}