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

Download history 22750/week @ 2022-12-02 26176/week @ 2022-12-09 26178/week @ 2022-12-16 17323/week @ 2022-12-23 18646/week @ 2022-12-30 26963/week @ 2023-01-06 25877/week @ 2023-01-13 23993/week @ 2023-01-20 31509/week @ 2023-01-27 29426/week @ 2023-02-03 32273/week @ 2023-02-10 33874/week @ 2023-02-17 25705/week @ 2023-02-24 22973/week @ 2023-03-03 31249/week @ 2023-03-10 24713/week @ 2023-03-17

111,860 downloads per month
Used in 3 crates (2 directly)

MIT license

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