repetitive 0.1.4

Macro for generating repetitive code
Documentation
use proc_macro2::TokenStream;
use syn::parse::{Parse, ParseStream, Parser};

use super::*;

pub trait ContextParse {
    fn ctx_parse(input: ParseStream, ctx: &mut Context) -> syn::Result<Self>
    where
        Self: Sized;
}

pub trait ContextParseExt {
    type Output;

    fn ctx_parse2(self, input: TokenStream, ctx: &mut Context) -> syn::Result<Self::Output>;
}

impl<T: Parse> ContextParse for T {
    fn ctx_parse(input: ParseStream, _ctx: &mut Context) -> syn::Result<Self> {
        T::parse(input)
    }
}

impl<T, F: FnOnce(ParseStream, &mut Context) -> syn::Result<T>> ContextParseExt for F {
    type Output = T;

    fn ctx_parse2(self, input: TokenStream, ctx: &mut Context) -> syn::Result<Self::Output> {
        (|input: ParseStream| {
            let output = self(input, ctx);

            let output = match output {
                Ok(output) => output,
                Err(e) => {
                    return Err(e);
                }
            };

            if !input.is_empty() {
                return Err(input.error("unexpected token"));
            }

            Ok(output)
        })
        .parse2(input)
    }
}