drylib-procs 0.1.13

Rust macro-library for Don't Repeating Yourself
Documentation
use proc_macro::{Ident, TokenTree};

#[derive(Debug, PartialEq)]
pub(crate) enum TokenType {
    None,
    Mutable,
    #[allow(dead_code)]
    Immutable,
    MutableReference,
    ImmutableReference
}

pub(crate) type IT = (Ident, TokenType);

pub fn parse_muts<I>(iter: I) -> Vec::<IT>
where I: Iterator<Item = TokenTree>
{
    iter.fold((TokenType::None, Vec::new()), |(ttype, mut ret), t| {
        if let TokenTree::Ident(ident) = t {
            if ident.to_string().eq("mut") {
                if ttype.eq(&TokenType::ImmutableReference) || ttype.eq(&TokenType::MutableReference) {
                    (TokenType::MutableReference, ret)
                } else { (TokenType::Mutable, ret) }
            } else {
                ret.push((ident, ttype));
                (TokenType::None, ret)
            }
        } else if let TokenTree::Punct(punct) = t {
            if punct.as_char().eq(&'&') {
                (TokenType::ImmutableReference, ret)
            } else { (TokenType::None, ret) }
        } else {
            if ttype.eq(&TokenType::Mutable) || ttype.eq(&TokenType::MutableReference) {
                panic!("Expected identifier after `mut`")
            } (TokenType::None, ret)
        }
    }).1
}