#![forbid(unsafe_code)]
#[macro_export]
macro_rules! setters {
(
$(#[$meta:meta])*
$method:ident < direct > -> $field:ident : impl Into< $inner:ty >;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $method<T>(mut self, $field: T) -> Self
where
T: Into<$inner>,
{
self.$field = $field.into();
self
}
$crate::setters!($($rest)*);
};
(
$(#[$meta:meta])*
$method:ident -> $field:ident : impl Into< $inner:ty >;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $method<T>(mut self, $field: T) -> Self
where
T: Into<$inner>,
{
self.$field = Some($field.into());
self
}
$crate::setters!($($rest)*);
};
(
$(#[$meta:meta])*
$name:ident < direct > : impl Into< $inner:ty >;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $name<T>(mut self, $name: T) -> Self
where
T: Into<$inner>,
{
self.$name = $name.into();
self
}
$crate::setters!($($rest)*);
};
(
$(#[$meta:meta])*
$name:ident : impl Into< $inner:ty >;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $name<T>(mut self, $name: T) -> Self
where
T: Into<$inner>,
{
self.$name = Some($name.into());
self
}
$crate::setters!($($rest)*);
};
(
$(#[$meta:meta])*
$method:ident < direct > -> $field:ident : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $method(mut self, $field: $ty) -> Self {
self.$field = $field;
self
}
$crate::setters!($($rest)*);
};
(
$(#[$meta:meta])*
$method:ident -> $field:ident : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $method(mut self, $field: $ty) -> Self {
self.$field = Some($field);
self
}
$crate::setters!($($rest)*);
};
(
$(#[$meta:meta])*
$name:ident < direct > : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $name(mut self, $name: $ty) -> Self {
self.$name = $name;
self
}
$crate::setters!($($rest)*);
};
(
$(#[$meta:meta])*
$name:ident : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $name(mut self, $name: $ty) -> Self {
self.$name = Some($name);
self
}
$crate::setters!($($rest)*);
};
() => {};
}
#[macro_export]
macro_rules! mut_setters {
(
$(#[$meta:meta])*
$method:ident < direct > -> $field:ident : impl Into< $inner:ty >;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $method<T>(&mut self, $field: T)
where
T: Into<$inner>,
{
self.$field = $field.into();
}
$crate::mut_setters!($($rest)*);
};
(
$(#[$meta:meta])*
$method:ident -> $field:ident : impl Into< $inner:ty >;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $method<T>(&mut self, $field: T)
where
T: Into<$inner>,
{
self.$field = Some($field.into());
}
$crate::mut_setters!($($rest)*);
};
(
$(#[$meta:meta])*
$name:ident < direct > : impl Into< $inner:ty >;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $name<T>(&mut self, $name: T)
where
T: Into<$inner>,
{
self.$name = $name.into();
}
$crate::mut_setters!($($rest)*);
};
(
$(#[$meta:meta])*
$name:ident : impl Into< $inner:ty >;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $name<T>(&mut self, $name: T)
where
T: Into<$inner>,
{
self.$name = Some($name.into());
}
$crate::mut_setters!($($rest)*);
};
(
$(#[$meta:meta])*
$method:ident < direct > -> $field:ident : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $method(&mut self, $field: $ty) {
self.$field = $field;
}
$crate::mut_setters!($($rest)*);
};
(
$(#[$meta:meta])*
$method:ident -> $field:ident : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $method(&mut self, $field: $ty) {
self.$field = Some($field);
}
$crate::mut_setters!($($rest)*);
};
(
$(#[$meta:meta])*
$name:ident < direct > : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $name(&mut self, $name: $ty) {
self.$name = $name;
}
$crate::mut_setters!($($rest)*);
};
(
$(#[$meta:meta])*
$name:ident : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $name(&mut self, $name: $ty) {
self.$name = Some($name);
}
$crate::mut_setters!($($rest)*);
};
() => {};
}
#[macro_export]
macro_rules! ref_getters {
(
$(#[$meta:meta])*
$method:ident -> $field:ident : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $method(&self) -> Option<&$ty> {
self.$field.as_ref()
}
$crate::ref_getters!($($rest)*);
};
(
$(#[$meta:meta])*
$name:ident : $ty:ty;
$($rest:tt)*
) => {
$(#[$meta])*
pub fn $name(&self) -> Option<&$ty> {
self.$name.as_ref()
}
$crate::ref_getters!($($rest)*);
};
() => {};
}