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' });