#[macro_export]
macro_rules! get {
($fn_vis:vis $name:ident => $value_type:ty) => {
$fn_vis fn $name(&self) -> &$value_type {
&self.$name
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, $value_type:ty) => {
$fn_vis fn $fn_name(&self) -> &$value_type {
&self.$field_name
}
};
($fn_vis:vis $name:ident => optional $value_type:ty) => {
$fn_vis fn $name(&self) -> Option<&$value_type> {
self.$name.as_ref()
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, optional $value_type:ty) => {
$fn_vis fn $fn_name(&self) -> Option<&$value_type> {
self.$field_name.as_ref()
}
};
($fn_vis:vis $name:ident => copy $value_type:ty) => {
$fn_vis fn $name(&self) -> $value_type {
self.$name
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, copy $value_type:ty) => {
$fn_vis fn $fn_name(&self) -> $value_type {
self.$field_name
}
};
}
#[macro_export]
macro_rules! get_mut {
($fn_vis:vis $name:ident => $value_type:ty) => {
$fn_vis fn $name(&mut self) -> &mut $value_type {
&mut self.$name
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, $value_type:ty) => {
$fn_vis fn $fn_name(&mut self) -> &mut $value_type {
&mut self.$field_name
}
};
}
#[macro_export]
macro_rules! set {
($fn_vis:vis $name:ident => $value_type:ty) => {
paste::paste! {
$fn_vis fn [<set_ $name>](&mut self, value: $value_type) {
self.$name = value;
}
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, $value_type:ty) => {
paste::paste! {
$fn_vis fn [<set_ $fn_name>](&mut self, value: $value_type) {
self.$field_name = value;
}
}
};
($fn_vis:vis $name:ident => into $value_type:ty) => {
paste::paste! {
$fn_vis fn [<set_ $name>]<T: Into<$value_type>>(&mut self, value: T) {
self.$name = value.into();
}
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, into $value_type:ty) => {
paste::paste! {
$fn_vis fn [<set_ $fn_name>]<T: Into<$value_type>>(&mut self, value: T) {
self.$field_name = value.into();
}
}
};
($fn_vis:vis $name:ident => optional $value_type:ty) => {
paste::paste! {
$fn_vis fn [<set_ $name>](&mut self, value: $value_type) {
self.$name = Some(value);
}
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, optional $value_type:ty) => {
paste::paste! {
$fn_vis fn [<set_ $fn_name>](&mut self, value: $value_type) {
self.$field_name = Some(value);
}
}
};
}
#[macro_export]
macro_rules! unset {
($fn_vis:vis $name:ident) => {
paste::paste! {
$fn_vis fn [<unset_ $name>](&mut self,) {
self.$name = None;
}
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident) => {
paste::paste! {
$fn_vis fn [<unset_ $fn_name>](&mut self) {
self.$field_name = None;
}
}
};
}
#[macro_export]
macro_rules! with {
($fn_vis:vis $name:ident => $value_type:ty) => {
paste::paste! {
$fn_vis fn [<with_ $name>](mut self, value: $value_type) -> Self {
self.$name = value;
self
}
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, $value_type:ty) => {
paste::paste! {
$fn_vis fn [<with_ $fn_name>](mut self, value: $value_type) -> Self {
self.$field_name = value;
self
}
}
};
($fn_vis:vis $name:ident => into $value_type:ty) => {
paste::paste! {
$fn_vis fn [<with_ $name>]<T: Into<$value_type>>(mut self, value: T) -> Self {
self.$name = value.into();
self
}
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, into $value_type:ty) => {
paste::paste! {
$fn_vis fn [<with_ $fn_name>]<T: Into<$value_type>>(mut self, value: T) -> Self {
self.$field_name = value.into();
self
}
}
};
($fn_vis:vis $name:ident => optional $value_type:ty) => {
paste::paste! {
$fn_vis fn [<with_ $name>](mut self, value: $value_type) -> Self {
self.$name = Some(value);
self
}
}
};
($fn_vis:vis $fn_name:ident => $field_name:ident, optional $value_type:ty) => {
paste::paste! {
$fn_vis fn [<with_ $fn_name>](mut self, value: $value_type) -> Self {
self.$field_name = Some(value);
self
}
}
};
}
#[macro_export]
macro_rules! get_and_set {
($fn_vis:vis $name:ident => $value_type:ty) => {
$crate::get!($fn_vis $name => $value_type);
$crate::set!($fn_vis $name => $value_type);
};
($fn_vis:vis $fn_name:ident => $field_name:ident, $value_type:ty) => {
$crate::get!($fn_vis $fn_name => $field_name, $value_type);
$crate::set!($fn_vis $fn_name => $field_name, $value_type);
};
($fn_vis:vis $name:ident => into $value_type:ty) => {
$crate::get!($fn_vis $name => $value_type);
$crate::set!($fn_vis $name => into $value_type);
};
($fn_vis:vis $fn_name:ident => $field_name:ident, into $value_type:ty) => {
$crate::get!($fn_vis $fn_name => $field_name, $value_type);
$crate::set!($fn_vis $fn_name => $field_name, into $value_type);
};
($fn_vis:vis $name:ident => optional $value_type:ty) => {
$crate::get!($fn_vis $name => optional $value_type);
$crate::set!($fn_vis $name => optional $value_type);
};
($fn_vis:vis $fn_name:ident => $field_name:ident, optional $value_type:ty) => {
$crate::get!($fn_vis $fn_name => $field_name, optional $value_type);
$crate::set!($fn_vis $fn_name => $field_name, optional $value_type);
};
}
#[macro_export]
macro_rules! with_get_and_set {
($fn_vis:vis $name:ident => $value_type:ty) => {
$crate::with!($fn_vis $name => $value_type);
$crate::get_and_set!($fn_vis $name => $value_type);
};
($fn_vis:vis $fn_name:ident => $field_name:ident, $value_type:ty) => {
$crate::with!($fn_vis $fn_name => $field_name, $value_type);
$crate::get_and_set!($fn_vis $fn_name => $field_name, $value_type);
};
($fn_vis:vis $name:ident => into $value_type:ty) => {
$crate::with!($fn_vis $name => into $value_type);
$crate::get_and_set!($fn_vis $name => into $value_type);
};
($fn_vis:vis $fn_name:ident => $field_name:ident, into $value_type:ty) => {
$crate::with!($fn_vis $fn_name => $field_name, into $value_type);
$crate::get_and_set!($fn_vis $fn_name => $field_name, into $value_type);
};
($fn_vis:vis $name:ident => optional $value_type:ty) => {
$crate::with!($fn_vis $name => optional $value_type);
$crate::get_and_set!($fn_vis $name => optional $value_type);
};
($fn_vis:vis $fn_name:ident => $field_name:ident, optional $value_type:ty) => {
$crate::with!($fn_vis $fn_name => $field_name, optional $value_type);
$crate::get_and_set!($fn_vis $fn_name => $field_name, optional $value_type);
};
}
#[macro_export]
macro_rules! get_set_and_unset {
($fn_vis:vis $name:ident => $value_type:ty) => {
$crate::get_and_set!($fn_vis $name => optional $value_type);
$crate::unset!($fn_vis $name);
};
($fn_vis:vis $fn_name:ident => $field_name:ident, $value_type:ty) => {
$crate::get_and_set!($fn_vis $fn_name => $field_name, optional $value_type);
$crate::unset!($fn_vis $fn_name => $field_name);
};
}
pub mod access {
pub use crate::{get, get_and_set, get_mut, get_set_and_unset, set, with, with_get_and_set};
}
#[macro_export]
macro_rules! is_variant {
($fn_vis:vis $variant_name:ident) => {
paste::paste! {
$fn_vis fn [< is_ $variant_name:snake >](&self) -> bool {
matches!(self, Self::$variant_name)
}
}
};
($fn_vis:vis $variant_name:ident => $variant_type:ty) => {
paste::paste! {
$fn_vis fn [< is_ $variant_name:snake >](&self) -> bool {
matches!(self, Self::$variant_name(_))
}
}
};
}
#[macro_export]
macro_rules! as_variant {
($fn_vis:vis $variant_name:ident => $variant_type:ty) => {
paste::paste! {
$fn_vis fn [< as_ $variant_name:snake >](&self) -> Option<&$variant_type> {
match self {
Self::$variant_name(value) => Some(value),
_ => None,
}
}
}
};
}
#[macro_export]
macro_rules! is_as_variant {
($fn_vis:vis $variant_name:ident => $variant_type:ty) => {
paste::paste! {
$crate::is_variant!($fn_vis $variant_name => $variant_type);
$crate::as_variant!($fn_vis $variant_name => $variant_type);
}
};
}
pub mod variant {
pub use crate::{as_variant, is_as_variant, is_variant};
}