Macro optics::declare_lens_from_field

source ·
macro_rules! declare_lens_from_field {
    ($(
        $(#[$m:meta])* $vis:vis $name:ident for $field:tt
        $(as $base:ty => $target:ty $(, for<$($p:ident),+ $(,)?>)?)+
    );+ $(;)?) => { ... };
}
Expand description

Declare a Lens from a field name for a struct.

#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct Foo { a: u32, b: bool, c: char }
declare_lens_from_field! {
    /// Lens for `Foo::c`.
    pub FooC for c as Foo => char
}
assert_eq!(format!("{:?}", FooC), "Foo::c".to_string());
assert_eq!(format!("{}", FooC), "c".to_string());

let mut foo = Foo { a: 42, b: true, c: 'A' };
// Getter(Ref,Mut)
assert_eq!(FooC.view(foo), 'A');
assert_eq!(FooC.view_ref(&foo), &'A');
assert_eq!(FooC.view_mut(&mut foo), &mut 'A');
// AffineFold(Ref,Mut)
assert_eq!(FooC.preview(foo), Ok('A'));
assert_eq!(FooC.preview_ref(&foo), Ok(&'A'));
assert_eq!(FooC.preview_mut(&mut foo), Ok(&mut 'A'));
// Setter
FooC.over(&mut foo, &mut |c| c.make_ascii_lowercase());
assert_eq!(foo, Foo { a: 42, b: true, c: 'a' });
// AffineTraversal
FooC.set(&mut foo, 'X');
assert_eq!(foo, Foo { a: 42, b: true, c: 'X' });