1#[macro_export]
32macro_rules! gsw {
33 ($($name:ident: &$T:ty),* $(,)?) => {
34 gsw!(@set $($name: $T),*);
35 $(gsw!(@get $name: &$T);)*
36 };
37 ($($name:ident: $T:ty),* $(,)?) => {
38 gsw!(@set $($name: $T),*);
39 $(gsw!(@get $name: $T);)*
40 };
41 (@get $name:ident: &$T:ty) => {
42
43 paste::paste! {
44 pub const fn $name(&self) -> &$T {
45 &self.$name
46 }
47
48 #[doc(inline)]
49 pub fn [<$name _mut>] (&mut self) -> &mut $T {
50 &mut self.$name
51 }
52 }
53 };
54 (@get $name:ident: $(&)?$T:ty) => {
55 paste::paste! {
56 pub const fn $name(&self) -> $T {
57 self.$name
58 }
59
60 #[doc(inline)]
61 pub fn [<$name _mut>] (&mut self) -> &mut $T {
62 &mut self.$name
63 }
64 }
65 };
66 (@set $($name:ident: $T:ty),*) => {
67 $(
68 gsw!(@set_impl $name: $T);
69 )*
70 };
71 (@set_impl $name:ident: $T:ty) => {
72 paste::item! {
73 pub fn [<set_ $name>](&mut self, $name: $T) -> &mut Self {
74 *self.[<$name _mut>]() = $name;
75 self
76 }
77
78 pub fn [<with_ $name>] (self, $name: $T) -> Self {
79 Self {
80 $name,
81 ..self
82 }
83 }
84 }
85 };
86}