#[macro_export]
macro_rules! gsw {
($($name:ident: &$T:ty),* $(,)?) => {
$(
$crate::gsw!(@get $name: &$T);
$crate::gsw!(@get_mut $name: $T);
$crate::gsw!(@setter $name: $T);
)*
};
($($name:ident: $T:ty),* $(,)?) => {
$(
$crate::gsw!(@get $name: $T);
$crate::gsw!(@get_mut $name: $T);
$crate::gsw!(@setter $name: $T);
)*
};
(@get $name:ident: &$T:ty) => {
pub const fn $name(&self) -> &$T {
&self.$name
}
};
(@get $name:ident: $T:ty) => {
pub const fn $name(&self) -> $T {
self.$name
}
};
(@get_mut $name:ident: $T:ty) => {
paste::paste! {
pub const fn [<$name _mut>] (&mut self) -> &mut $T {
&mut self.$name
}
}
};
(@setter $name:ident: $T:ty) => {
paste::paste! {
pub fn [<set_ $name>](&mut self, $name: $T) -> &mut Self {
self.$name = $name;
self
}
pub fn [<with_ $name>] (self, $name: $T) -> Self {
Self {
$name,
..self
}
}
}
};
}
#[macro_export]
macro_rules! get_field {
($($name:ident: &$T:ty),* $(,)?) => {
$(
$crate::gsw!(@get $name: &$T);
$crate::gsw!(@get_mut $name: $T);
$crate::gsw!(@setter $name: $T);
)*
};
($($name:ident: $T:ty),* $(,)?) => {
$(
$crate::gsw!(@get $name: $T);
$crate::gsw!(@get_mut $name: $T);
$crate::gsw!(@setter $name: $T);
)*
};
(@getter $name:ident: &$T:ty) => {
pub const fn $name(&self) -> &$T {
&self.$name
}
};
(@getter $name:ident: $T:ty) => {
pub const fn $name(&self) -> $T {
self.$name
}
};
(@get_mut $name:ident: $T:ty) => {
paste::paste! {
pub const fn [<$name _mut>] (&mut self) -> &mut $T {
&mut self.$name
}
}
};
(@get $name:ident: &$T:ty) => {
pub const fn $name(&self) -> &$T {
&self.$name
}
};
(@get $name:ident: $T:ty) => {
pub const fn $name(&self) -> $T {
self.$name
}
};
}