mkutils-macros 0.1.135

Utility methods, traits, and types.
Documentation
use proc_macro2::Ident;
use syn::{
    Error as SynError, Token,
    parse::{Parse, ParseStream},
    punctuated::Punctuated,
};

macro_rules! declare_cat_type {
    ($name:ident < $($T:ident),+ >) => {
        pub struct $name<$($T),+>($(pub $T),+);

        impl<$($T),+> $name<$($T),+> {
            #[allow(non_snake_case)]
            pub fn into_tuple(self) -> ($($T),+) {
                let Self($($T),+) = self;

                ($($T),+)
            }
        }

        impl<$($T: Parse),+> Parse for $name<$($T),+> {
            fn parse(parse_stream: ParseStream) -> Result<Self, SynError> {
                Ok(Self(
                    $(parse_stream.parse::<$T>()?),+
                ))
            }
        }
    };
}

declare_cat_type!(Cat3<X, Y, Z>);
declare_cat_type!(Cat6<U, V, W, X, Y, Z>);

pub type Assignment<L, R> = Cat3<L, Token![=], R>;
pub type IdentAssignment<T> = Assignment<Ident, T>;
pub type Comma = Token![,];
pub type CommaPunctuated<T> = Punctuated<T, Comma>;