option_operations/macros/
option_op_assign.rs

1macro_rules! option_op_assign {
2    ($trait:ident, $op:ident, $op_name:ident $(, $extra_doc:expr)? $(,)?) => {
3        paste::paste! {
4            #[doc = "Trait for values and `Option`s " $op_name " assignment."]
5            ///
6            /// Implementing this trait leads to the following auto-implementations:
7            ///
8            #[doc = "- `" [<Option $trait Assign>] "<Option<InnerRhs>>` for `T`."]
9            #[doc = "- `" [<Option $trait Assign>] "<Rhs>` for `Option<T>`."]
10            #[doc = "- `" [<Option $trait Assign>] "<Option<InnerRhs>>` for `Option<T>`."]
11            /// - ... and some variants with references.
12            ///
13            /// This trait is auto-implemented for [`OptionOperations`] types implementing
14            #[doc = "`" $trait "<Rhs>`."]
15            pub trait [<Option $trait Assign>]<Rhs = Self, InnerRhs = Rhs> {
16                #[doc = "Performs the " $op_name " assignment."]
17                ///
18                /// `self` is unchanged if `rhs` is `None`.
19                $(#[doc = $extra_doc])?
20                fn [<opt_ $op _assign>](&mut self, rhs: Rhs);
21            }
22
23            impl<T, Rhs> [<Option $trait Assign>]<Rhs> for T
24            where
25                T: OptionOperations + [<$trait Assign>]<Rhs>,
26            {
27                fn [<opt_ $op _assign>](&mut self, rhs: Rhs) {
28                    self.[<$op _assign>](rhs)
29                }
30            }
31
32            impl<T, InnerRhs> [<Option $trait Assign>]<Option<InnerRhs>, InnerRhs> for T
33            where
34                T: OptionOperations + [<Option $trait Assign>]<InnerRhs>,
35            {
36                fn [<opt_ $op _assign>](&mut self, rhs: Option<InnerRhs>) {
37                    if let Some(inner_rhs) = rhs {
38                        self.[<opt_ $op _assign>](inner_rhs)
39                    }
40                }
41            }
42
43            impl<T, InnerRhs> [<Option $trait Assign>]<&Option<InnerRhs>, InnerRhs> for T
44            where
45                T: OptionOperations + [<Option $trait Assign>]<InnerRhs>,
46                InnerRhs: Copy,
47            {
48                fn [<opt_ $op _assign>](&mut self, rhs: &Option<InnerRhs>) {
49                    if let Some(inner_rhs) = rhs.as_ref() {
50                        self.[<opt_ $op _assign>](*inner_rhs)
51                    }
52                }
53            }
54
55            impl<T, Rhs> [<Option $trait Assign>]<Rhs> for Option<T>
56            where
57                T: OptionOperations + [<Option $trait Assign>]<Rhs>,
58            {
59                fn [<opt_ $op _assign>](&mut self, rhs: Rhs) {
60                    if let Some(inner_self) = self {
61                        inner_self.[<opt_ $op _assign>](rhs)
62                    }
63                }
64            }
65
66            impl<T, InnerRhs> [<Option $trait Assign>]<Option<InnerRhs>, InnerRhs> for Option<T>
67            where
68                T: OptionOperations + [<Option $trait Assign>]<InnerRhs>,
69            {
70                fn [<opt_ $op _assign>](&mut self, rhs: Option<InnerRhs>) {
71                    if let Some((inner_self, inner_rhs)) = self.as_mut().zip(rhs) {
72                        inner_self.[<opt_ $op _assign>](inner_rhs)
73                    }
74                }
75            }
76
77            impl<T, InnerRhs> [<Option $trait Assign>]<&Option<InnerRhs>, InnerRhs> for Option<T>
78            where
79                T: OptionOperations + [<Option $trait Assign>]<InnerRhs>,
80                InnerRhs: Copy,
81            {
82                fn [<opt_ $op _assign>](&mut self, rhs: &Option<InnerRhs>) {
83                    if let Some((inner_self, inner_rhs)) = self.as_mut().zip(rhs.as_ref()) {
84                        inner_self.[<opt_ $op _assign>](*inner_rhs)
85                    }
86                }
87            }
88        }
89    };
90}