preinterpret 0.2.1

An intuitive toolkit to simplify code generation development
Documentation
pub(crate) use core::iter;
pub(crate) use proc_macro2::*;
pub(crate) use std::{collections::HashMap, str::FromStr};
pub(crate) use syn::{parse_str, Error, Lit, Result};

pub(crate) use crate::command::*;
pub(crate) use crate::commands::*;
pub(crate) use crate::interpreter::*;
pub(crate) use crate::parsing::*;
pub(crate) use crate::string_conversion::*;

pub(crate) struct Tokens(iter::Peekable<<TokenStream as IntoIterator>::IntoIter>);

impl Tokens {
    pub(crate) fn new(tokens: TokenStream) -> Self {
        Self(tokens.into_iter().peekable())
    }

    pub(crate) fn peek(&mut self) -> Option<&TokenTree> {
        self.0.peek()
    }

    pub(crate) fn next(&mut self) -> Option<TokenTree> {
        self.0.next()
    }

    pub(crate) fn next_as_ident(&mut self) -> Option<Ident> {
        match self.next() {
            Some(TokenTree::Ident(ident)) => Some(ident),
            _ => None,
        }
    }

    pub(crate) fn next_as_punct_matching(&mut self, char: char) -> Option<Punct> {
        match self.next() {
            Some(TokenTree::Punct(punct)) if punct.as_char() == char => Some(punct),
            _ => None,
        }
    }

    pub(crate) fn into_token_stream(self) -> TokenStream {
        self.0.collect()
    }
}

pub(crate) trait SpanErrorExt {
    fn error(self, message: impl std::fmt::Display) -> Error;
}

impl SpanErrorExt for Span {
    fn error(self, message: impl std::fmt::Display) -> Error {
        Error::new(self, message)
    }
}