Macro optics::declare_prism_from_variant

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

Declare a Prism from a variant name for an enum.

Note: Only tuple-like variant with exactly one field is supported. For unsupported enums, use declare_affine_traversal, and implement Review and Prism manually: the former specifies how to construct an instance of that enum from this variant, and the latter is only a marker trait.

#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum Foo {
    Int(u32),
    Char(char),
}
declare_prism_from_variant! {
    /// Prism for `Foo::Char`.
    pub FooChar for Char as Foo => char
}
assert_eq!(format!("{:?}", FooChar), "Foo::Char".to_string());
assert_eq!(format!("{}", FooChar), "Char".to_string());

let mut foo = Foo::Char('A');
let mut bar = Foo::Int(42);
// AffineFold(Ref,Mut)
assert_eq!(FooChar.preview(foo), Ok('A'));
assert_eq!(FooChar.preview_ref(&foo), Ok(&'A'));
assert_eq!(FooChar.preview_mut(&mut foo), Ok(&mut 'A'));
assert_eq!(FooChar.preview(bar), Err(FooChar));
assert_eq!(FooChar.preview_ref(&bar), Err(FooChar));
assert_eq!(FooChar.preview_mut(&mut bar), Err(FooChar));
// Setter
FooChar.over(&mut foo, &mut |c| c.make_ascii_lowercase());
assert_eq!(foo, Foo::Char('a'));
FooChar.over(&mut bar, &mut |c| c.make_ascii_lowercase());
assert_eq!(bar, Foo::Int(42));
// AffineTraversal
FooChar.set(&mut foo, 'X');
assert_eq!(foo, Foo::Char('X'));
FooChar.set(&mut bar, 'X');
assert_eq!(bar, Foo::Int(42));