utterance 0.2.1

A parser library for creating readable, natural-language-inspired domain-specific languages.
Documentation
use crate::parser::expectation::Statement;
use crate::parser::tree::ParseContext;

pub fn noop_fn<C>(_: &mut C, _: &Statement) -> Result<(), C::Error>
where
    C: ParseContext,
{
    Ok(())
}

pub type TreeFn<C> = fn(&mut C, &Statement) -> Result<(), <C as ParseContext>::Error>;

#[macro_export]
macro_rules! tree_fn {
    (Noop($context:ident) => $body:block) => {
        |$context, statement| match statement {
            $crate::parser::expectation::Statement::Noop => $body,
            _ => unreachable!(),
        }
    };

    (Comment($context:ident) => $body:block) => {
        |$context, statement| match statement {
            $crate::parser::expectation::Statement::Comment => $body,
            _ => unreachable!(),
        }
    };

    (Word($context:ident, $value:ident) => $body:block) => {
        |$context, statement| {
            let $value = match statement {
                $crate::parser::expectation::Statement::Word(value) => value,
                _ => unreachable!(),
            };

            $body
        }
    };

    (ExactWord($context:ident, $value:ident) => $body:block) => {
        |$context, statement| {
            let $value = match statement {
                $crate::parser::expectation::Statement::Word($crate::lexer::Word::Exact(value)) => {
                    value
                }
                _ => unreachable!(),
            };

            $body
        }
    };

    (Symbol($context:ident, $value:ident) => $body:block) => {
        |$context, statement| {
            let $value = match statement {
                $crate::parser::expectation::Statement::Symbol(value) => value,
                _ => unreachable!(),
            };

            $body
        }
    };

    (Punctuation($context:ident, $value:ident) => $body:block) => {
        |$context, statement| {
            let $value = match statement {
                $crate::parser::expectation::Statement::Symbol(
                    $crate::lexer::Symbol::Punctuation(value),
                ) => value,
                _ => unreachable!(),
            };

            $body
        }
    };

    (SpecialChar($context:ident, $value:ident) => $body:block) => {
        |$context, statement| {
            let $value = match statement {
                $crate::parser::expectation::Statement::Symbol(
                    $crate::lexer::Symbol::SpecialChar(value),
                ) => value,
                _ => unreachable!(),
            };

            $body
        }
    };

    (Number($context:ident, $value:ident) => $body:block) => {
        |$context, statement| {
            let $value = match statement {
                $crate::parser::expectation::Statement::Number(value) => value,
                _ => unreachable!(),
            };

            $body
        }
    };

    (UnsignedInteger($context:ident, $value:ident) => $body:block) => {
        |$context, statement| {
            let $value = match statement {
                $crate::parser::expectation::Statement::Number(
                    $crate::lexer::Number::UnsignedInteger(value),
                ) => value,
                _ => unreachable!(),
            };

            $body
        }
    };

    (Integer($context:ident, $value:ident) => $body:block) => {
        |$context, statement| {
            let $value = match statement {
                $crate::parser::expectation::Statement::Number($crate::lexer::Number::Integer(
                    value,
                )) => value,
                _ => unreachable!(),
            };

            $body
        }
    };

    (Float($context:ident, $value:ident) => $body:block) => {
        |$context, statement| {
            let $value = match statement {
                $crate::parser::expectation::Statement::Number($crate::lexer::Number::Float(
                    value,
                )) => value,
                _ => unreachable!(),
            };

            $body
        }
    };
}

#[macro_export]
macro_rules! setter_fn {
    ($method:ident($($arg:expr),*)) => {
        |context, _: &$crate::parser::expectation::Statement| {
            context.$method($($arg),*)
        }
    };
}

pub use setter_fn;
pub use tree_fn;