frunk_proc_macros 0.0.4

Proc macros for Frunk
Documentation

Module that holds procedural macros for Frunk

Examples

#[macro_use] extern crate frunk;
#[macro_use] extern crate frunk_core;
# extern crate frunk_proc_macros;
# use frunk_proc_macros::{path, Path};
# fn main() {
#[derive(LabelledGeneric)]
struct Dog<'a> {
name: &'a str,
dimensions: Dimensions,
}

#[derive(LabelledGeneric)]
struct Cat<'a> {
name: &'a str,
dimensions: Dimensions,
}

#[derive(LabelledGeneric)]
struct Dimensions {
height: usize,
width: usize,
unit: SizeUnit,
}

#[derive(Debug, Eq, PartialEq)]
enum SizeUnit {
Cm,
Inch,
}

let mut dog = Dog {
name: "Joe",
dimensions: Dimensions {
height: 10,
width: 5,
unit: SizeUnit::Inch,
},
};

let cat = Cat {
name: "Schmoe",
dimensions: Dimensions {
height: 7,
width: 3,
unit: SizeUnit::Cm,
},
};

// generic, re-usable paths
let height_lens: Path!(dimensions.height) = path!(dimensions.height);
let unit_lens: Path!(dimensions.unit) = path!(dimensions.unit);

assert_eq!(*height_lens.get(&dog), 10);
assert_eq!(*height_lens.get(&cat), 7);
assert_eq!(*unit_lens.get(&dog), SizeUnit::Inch);
assert_eq!(*unit_lens.get(&cat), SizeUnit::Cm);

// modify
*height_lens.get(&mut dog) = 13;
assert_eq!(*height_lens.get(&dog), 13);
# }