xylem-codegen 0.2.7

Codegen backend for xylem
Documentation
#![cfg(test)]

use proc_macro2::{TokenStream, TokenTree};

mod full;
mod process_field;

fn token_stream_equals(ts1: TokenStream, ts2: TokenStream) -> bool {
    let mut ts1 = ts1.into_iter().fuse();
    let mut ts2 = ts2.into_iter().fuse();

    loop {
        match (ts1.next(), ts2.next()) {
            (Some(tt1), Some(tt2)) => match (tt1, tt2) {
                (TokenTree::Ident(i1), TokenTree::Ident(i2)) => {
                    if i1 != i2 {
                        return false;
                    }
                }
                (TokenTree::Punct(p1), TokenTree::Punct(p2)) => {
                    if p1.as_char() != p2.as_char() {
                        return false;
                    }
                }
                (TokenTree::Literal(l1), TokenTree::Literal(l2)) => {
                    if l1.to_string() != l2.to_string() {
                        return false;
                    }
                }
                (TokenTree::Group(g1), TokenTree::Group(g2)) => {
                    if !token_stream_equals(g1.stream(), g2.stream()) {
                        return false;
                    }
                }
                _ => return false,
            },
            (None, None) => return true,
            (Some(tt1), None) => {
                if let TokenTree::Punct(p1) = tt1 {
                    if p1.as_char() == ',' && ts1.next().is_none() {
                        return true;
                    }
                }
                return false;
            }
            (None, Some(tt2)) => {
                if let TokenTree::Punct(p2) = tt2 {
                    if p2.as_char() == ',' && ts2.next().is_none() {
                        return true;
                    }
                }
                return false;
            }
        }
    }
}