o2o 0.2.3

Object to Object mapper for Rust
Documentation
use o2o::o2o;
use o2o::traits::IntoExisting;

#[derive(Default)]
struct Car {
    number_of_doors: i8,
    vehicle: Vehicle
}
#[derive(Default)]
struct Vehicle {
    number_of_seats: i16,
    can_fly: bool,
    needs_driver: bool,
    horsepower: i32,
    top_speed: f32,
    machine: Machine,
}
#[derive(Default)]
struct Machine {
    id: i32,
    brand: String,
    year: i16,
    weight: f32,
    length: f32,
    width: f32,
    height: f32,
}

#[derive(o2o)]
#[map(Car)]
#[into_existing(Car)]
#[children(vehicle: Vehicle, vehicle.machine: Machine)]
#[ghost(vehicle.machine@id: { 321 })]
struct CarDto {
    number_of_doors: i8,

    #[o2o(repeat)] #[child(vehicle)]
    number_of_seats: i16,
    can_fly: bool,
    needs_driver: bool,
    horsepower: i32,
    top_speed: f32,
    #[o2o(stop_repeat)]

    #[o2o(repeat(child))] #[child(vehicle.machine)]
    #[map(~.clone())]
    brand: String,
    year: i16,
    weight: f32,
    length: f32,
    width: f32,
    height: f32,
    #[o2o(stop_repeat)]

    #[o2o(repeat(ghost))] #[ghost({123})]
    useless_param: i32,
    useless_param_2: i32,
    useless_param_3: i32,
}

#[test]
fn named2named() {
    let car = Car {
        number_of_doors: 2,
        vehicle: Vehicle { 
            number_of_seats: 4,
            can_fly: false,
            horsepower: 30,
            needs_driver: true,
            top_speed: 105.0,
            machine: Machine { 
                id: 123, 
                brand: "Trabant".into(), 
                year: 1960,
                weight: 615.0,
                length: 3360.0,
                width: 1500.0,
                height: 1440.0
            }
        }
    };

    let car_dto: CarDto = car.into();

    assert_eq!(2, car_dto.number_of_doors);
    assert_eq!(4, car_dto.number_of_seats);
    assert_eq!(false, car_dto.can_fly);
    assert_eq!(true, car_dto.needs_driver);
    assert_eq!(30, car_dto.horsepower);
    assert_eq!(105.0, car_dto.top_speed);
    assert_eq!("Trabant", car_dto.brand);
    assert_eq!(1960, car_dto.year);
    assert_eq!(615.0, car_dto.weight);
    assert_eq!(3360.0, car_dto.length);
    assert_eq!(1500.0, car_dto.width);
    assert_eq!(1440.0, car_dto.height);
    assert_eq!(123, car_dto.useless_param);
    assert_eq!(123, car_dto.useless_param_2);
    assert_eq!(123, car_dto.useless_param_3);
}

#[test]
fn named2named_reverse() {
    let car_dto = CarDto {
        number_of_doors: 2,
        number_of_seats: 4,
        can_fly: false,
        needs_driver: true,
        horsepower: 30,
        top_speed: 105.0,
        brand: "Trabant".into(),
        year: 1960,
        weight: 615.0,
        length: 3360.0,
        width: 1500.0,
        height: 1440.0,
        useless_param: 123,
        useless_param_2: 123,
        useless_param_3: 123
    };

    let car: Car = car_dto.into();

    assert_eq!(2, car.number_of_doors);
    assert_eq!(4, car.vehicle.number_of_seats);
    assert_eq!(false, car.vehicle.can_fly);
    assert_eq!(true, car.vehicle.needs_driver);
    assert_eq!(30, car.vehicle.horsepower);
    assert_eq!(105.0, car.vehicle.top_speed);
    assert_eq!("Trabant", car.vehicle.machine.brand);
    assert_eq!(1960, car.vehicle.machine.year);
    assert_eq!(615.0, car.vehicle.machine.weight);
    assert_eq!(3360.0, car.vehicle.machine.length);
    assert_eq!(1500.0, car.vehicle.machine.width);
    assert_eq!(1440.0, car.vehicle.machine.height);
}

#[test]
fn named2named_ref() {
    let car = &Car {
        number_of_doors: 2,
        vehicle: Vehicle { 
            number_of_seats: 4,
            can_fly: false,
            horsepower: 30,
            needs_driver: true,
            top_speed: 105.0,
            machine: Machine { 
                id: 123, 
                brand: "Trabant".into(), 
                year: 1960,
                weight: 615.0,
                length: 3360.0,
                width: 1500.0,
                height: 1440.0
            }
        }
    };

    let car_dto: CarDto = car.into();

    assert_eq!(car.number_of_doors, car_dto.number_of_doors);
    assert_eq!(car.vehicle.number_of_seats, car_dto.number_of_seats);
    assert_eq!(car.vehicle.can_fly, car_dto.can_fly);
    assert_eq!(car.vehicle.needs_driver, car_dto.needs_driver);
    assert_eq!(car.vehicle.horsepower, car_dto.horsepower);
    assert_eq!(car.vehicle.top_speed, car_dto.top_speed);
    assert_eq!(car.vehicle.machine.brand, car_dto.brand);
    assert_eq!(car.vehicle.machine.year, car_dto.year);
    assert_eq!(car.vehicle.machine.weight, car_dto.weight);
    assert_eq!(car.vehicle.machine.length, car_dto.length);
    assert_eq!(car.vehicle.machine.width, car_dto.width);
    assert_eq!(car.vehicle.machine.height, car_dto.height);
    assert_eq!(123, car_dto.useless_param);
    assert_eq!(123, car_dto.useless_param_2);
    assert_eq!(123, car_dto.useless_param_3);
}

#[test]
fn named2named_reverse_ref() {
    let car_dto = &CarDto {
        number_of_doors: 2,
        number_of_seats: 4,
        can_fly: false,
        needs_driver: true,
        horsepower: 30,
        top_speed: 105.0,
        brand: "Trabant".into(),
        year: 1960,
        weight: 615.0,
        length: 3360.0,
        width: 1500.0,
        height: 1440.0,
        useless_param: 123,
        useless_param_2: 123,
        useless_param_3: 123
    };

    let car: Car = car_dto.into();

    assert_eq!(car_dto.number_of_doors, car.number_of_doors);
    assert_eq!(car_dto.number_of_seats, car.vehicle.number_of_seats);
    assert_eq!(car_dto.can_fly, car.vehicle.can_fly);
    assert_eq!(car_dto.needs_driver, car.vehicle.needs_driver);
    assert_eq!(car_dto.horsepower, car.vehicle.horsepower);
    assert_eq!(car_dto.top_speed, car.vehicle.top_speed);
    assert_eq!(car_dto.brand, car.vehicle.machine.brand);
    assert_eq!(car_dto.year, car.vehicle.machine.year);
    assert_eq!(car_dto.weight, car.vehicle.machine.weight);
    assert_eq!(car_dto.length, car.vehicle.machine.length);
    assert_eq!(car_dto.width, car.vehicle.machine.width);
    assert_eq!(car_dto.height, car.vehicle.machine.height);
}

#[test]
fn existing_named2named() {
    let car_dto = CarDto {
        number_of_doors: 2,
        number_of_seats: 4,
        can_fly: false,
        needs_driver: true,
        horsepower: 30,
        top_speed: 105.0,
        brand: "Trabant".into(),
        year: 1960,
        weight: 615.0,
        length: 3360.0,
        width: 1500.0,
        height: 1440.0,
        useless_param: 123,
        useless_param_2: 123,
        useless_param_3: 123
    };

    let mut car: Car = Default::default();
    car_dto.into_existing(&mut car);

    assert_eq!(2, car.number_of_doors);
    assert_eq!(4, car.vehicle.number_of_seats);
    assert_eq!(false, car.vehicle.can_fly);
    assert_eq!(true, car.vehicle.needs_driver);
    assert_eq!(30, car.vehicle.horsepower);
    assert_eq!(105.0, car.vehicle.top_speed);
    assert_eq!("Trabant", car.vehicle.machine.brand);
    assert_eq!(1960, car.vehicle.machine.year);
    assert_eq!(615.0, car.vehicle.machine.weight);
    assert_eq!(3360.0, car.vehicle.machine.length);
    assert_eq!(1500.0, car.vehicle.machine.width);
    assert_eq!(1440.0, car.vehicle.machine.height);
}

#[test]
fn existing_named2named_reverse() {
    let car_dto = &CarDto {
        number_of_doors: 2,
        number_of_seats: 4,
        can_fly: false,
        needs_driver: true,
        horsepower: 30,
        top_speed: 105.0,
        brand: "Trabant".into(),
        year: 1960,
        weight: 615.0,
        length: 3360.0,
        width: 1500.0,
        height: 1440.0,
        useless_param: 123,
        useless_param_2: 123,
        useless_param_3: 123
    };

    let mut car: Car = Default::default();
    car_dto.into_existing(&mut car);

    assert_eq!(car_dto.number_of_doors, car.number_of_doors);
    assert_eq!(car_dto.number_of_seats, car.vehicle.number_of_seats);
    assert_eq!(car_dto.can_fly, car.vehicle.can_fly);
    assert_eq!(car_dto.needs_driver, car.vehicle.needs_driver);
    assert_eq!(car_dto.horsepower, car.vehicle.horsepower);
    assert_eq!(car_dto.top_speed, car.vehicle.top_speed);
    assert_eq!(car_dto.brand, car.vehicle.machine.brand);
    assert_eq!(car_dto.year, car.vehicle.machine.year);
    assert_eq!(car_dto.weight, car.vehicle.machine.weight);
    assert_eq!(car_dto.length, car.vehicle.machine.length);
    assert_eq!(car_dto.width, car.vehicle.machine.width);
    assert_eq!(car_dto.height, car.vehicle.machine.height);
}