scsys_core/macros/
gsw.rs

1/*
2    Appellation: gsw <module>
3    Contrib: @FL03
4*/
5/// generates methods for some type or type reference
6///
7/// # Examples
8///
9/// ```rust
10/// use scsys_core::gsw;
11///
12/// #[derive(Debug, Clone)]
13///
14/// struct MyStruct<T> {
15///    a: u32,
16///    b: u32,
17///    c: T,
18/// }
19///
20/// impl<T> MyStruct<T> {
21///     gsw! {
22///         a: u32,
23///         b: u32,
24///     }
25///
26///    gsw! {
27///        c: &T,
28///    }
29/// }
30/// ```
31#[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}