texlang 0.1.0

Texlang: A TeX language interpreter
Documentation
macro_rules! get_required_element {
    ($stream :expr, $expected: expr, $guidance: expr, $($pat:pat => $result:expr,)+) => {
       match ($stream).next()? {
            None => Err::<_, Box<error::Error>>(crate::parse::Error::new($stream.vm(), $expected, None, $guidance).into()),
            Some(token) => match token.value() {
                 $(
                     $pat => Ok($result),
                 )+
                 _ => Err(crate::parse::Error::new($stream.vm(), $expected, Some(token), $guidance).into()),
            }
        }
    };
}

macro_rules! get_optional_element {
    ($stream :expr, $($pat:pat => $result:expr,)+) => {
       match match ($stream).peek()? {
            None => None,
            Some(token) => match token.value() {
                 $(
                     $pat => Some($result),
                 )+
                 _ => None,
            }
        }{
            None => None,
            Some(i) => {
                ($stream).consume()?;
                Some(i)
            }
        }
    };
}

macro_rules! get_optional_element_with_token {
    ($stream :expr, $($pat:pat => $result:expr,)+) => {
       match match ($stream).peek()? {
            None => None,
            Some(token) => match token.value() {
                 $(
                     $pat => Some($result),
                 )+
                 _ => None,
            }
        }{
            None => None,
            Some(i) => {
                let token = ($stream).next()?.unwrap();
                Some((i, token))
            }
        }
    };
}