7 releases
0.1.1 | Nov 3, 2022 |
---|---|
0.1.0 | Jun 25, 2021 |
0.0.5 | Apr 16, 2021 |
0.0.4 | Dec 21, 2019 |
0.0.2 | Feb 9, 2019 |
#613 in Rust patterns
111,860 downloads per month
Used in 3 crates
(2 directly)
195KB
3K
SLoC
Module that holds procedural macros for Frunk
Examples
# use frunk_proc_macros::{path, Path};
# use frunk::LabelledGeneric;
# 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);
# }
Dependencies
~0.7–1MB
~27K SLoC