macro_rules! setwith {
($($name:ident: $rhs:tt),* $(,)?) => {
$(
set!($name: $rhs);
with!($name: $rhs);
)*
};
}
macro_rules! set {
(@impl $name:ident: String) => {
paste::paste! {
pub fn [<set_ $name>](&mut self, $name: impl ToString) {
self.$name = $name.to_string();
}
}
};
(@impl $name:ident: Option<String>) => {
paste::paste! {
pub fn [<set_ $name>](&mut self, $name: impl ToString) {
self.$name = Some($name.to_string());
}
}
};
(@impl $name:ident: Option<$rhs:ty>) => {
paste::paste! {
pub fn [<set_ $name>](&mut self, $name: $rhs) {
self.$name = Some($name);
}
}
};
(@impl $name:ident: $rhs:ty) => {
paste::paste! {
pub fn [<set_ $name>](&mut self, $name: $rhs) {
self.$name = $name;
}
}
};
($($name:ident: $rhs:tt),* $(,)?) => {
$(
set!(@impl $name: $rhs);
)*
};
}
macro_rules! with {
(@impl $name:ident: Option<String>) => {
paste::paste! {
pub fn [<with_ $name>](self, $name: impl ToString) -> Self {
Self {
$name: Some($name.to_string()),
..Self
}
}
}
};
(@impl $name:ident: String) => {
paste::paste! {
pub fn [<with_ $name>](self, $name: impl ToString) -> Self {
Self {
$name: $name.to_string(),
..self
}
}
}
};
(@impl $name:ident: Option<$rhs:ty>) => {
paste::paste! {
pub fn [<with_ $name>](self, $name: $rhs) -> Self {
Self {
$name: Some($name),
..Self
}
}
}
};
(@impl $name:ident: $rhs:ty) => {
paste::paste! {
pub fn [<with_ $name>](self, $name: $rhs) -> Self {
Self {
$name,
..self
}
}
}
};
($($name:ident: $rhs:tt),* $(,)?) => {
$(
with!(@impl $name: $rhs);
)*
};
}