#lens #traversing #pattern #macro-derive

macro lens-rs_derive

macro to derive lens for data type

13 unstable releases (3 breaking)

0.3.2 May 7, 2021
0.3.1 Apr 8, 2021
0.2.2 Apr 3, 2021
0.2.1 Mar 29, 2021
0.0.88 Mar 21, 2021

#4 in #traversing


Used in 3 crates (via lens-rs)

MIT/Apache

105KB
2.5K SLoC

Overview

deriving lens for custom data types.

see the guide

Example

#[derive(Debug, Lens)]
struct Baz<'a, A, B, C>{
    #[optic(ref)] 
    a: &'a A,     // can only take the immutable ref by optics::a
    #[optic(mut)] 
    b: &'a mut B, // can take the mutable ref by optics::b
    #[optic]
    c: C          // can mv it out by by optics::c
}

#[derive(Review, Prism, Debug)]
enum AnEnum<T> {
    A(T, i32), // couldn't derive Prism or Review
    #[optic] 
    B(T),
    #[optic]
    C,
    #[optic]
    D(),
    #[optic]
    E {},
}

#[derive(Lens, Debug)]
struct Foo {
    #[optic] a: i32,
    #[optic] b: i32,
}

fn test() -> Option<()> {
    let x = Review::review(optics!(Some.B), Foo {
        a: 3,
        b: 2,
    });
    assert_eq!(x.preview(optics!(Some.B.b))?, 2);
    
    Some(())
}

Limitations

  • can't derive Lens for enum.
  • can't derive Prism and Review for the variant has more than one argument or has named field.

Dependencies

~1.2–1.8MB
~42K SLoC