pzzld-server 0.0.2

A production ready server optimized for WASM applications
Documentation
/*
    Appellation: setters <module>
    Contrib: FL03 <jo3mccain@icloud.com>
*/

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);
        )*
    };
}