#[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()
}
};
}
#[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) -> Self {
self.$field_name = Some(value);
self
}
}
};
}
pub mod access {
pub use crate::{get, get_mut, set, with};
}
#[macro_export]
macro_rules! is_variant {
($fn_vis:vis $type_name:ty, $variant_name:ident) => {
paste::paste! {
$fn_vis fn [< is_ $variant_name:snake >](&self) -> bool {
matches!(self, $type_name::$variant_name)
}
}
};
($fn_vis:vis $type_name:ty, $variant_name:ident => $variant_type:ty) => {
paste::paste! {
$fn_vis fn [< is_ $variant_name:snake >](&self) -> bool {
matches!(self, $type_name::$variant_name(_))
}
}
};
}
#[macro_export]
macro_rules! as_variant {
($fn_vis:vis $type_name:ty, $variant_name:ident => $variant_type:ty) => {
paste::paste! {
$fn_vis fn [< as_ $variant_name:snake >](&self) -> Option<&$variant_type> {
match self {
$type_name::$variant_name(value) => Some(value),
_ => None,
}
}
}
};
}
#[macro_export]
macro_rules! is_as_variant {
($fn_vis:vis $type_name:ty, $variant_name:ident => $variant_type:ty) => {
paste::paste! {
$fn_vis fn [< is_ $variant_name:snake >](&self) -> bool {
matches!(self, $type_name::$variant_name(_))
}
$fn_vis fn [< as_ $variant_name:snake >](&self) -> Option<&$variant_type> {
match self {
$type_name::$variant_name(value) => Some(value),
_ => None,
}
}
}
};
}
pub mod variant {
pub use crate::{is_variant, as_variant, is_as_variant};
}