secador-macro 0.1.0

Proc macros for secador crate
Documentation
use proc_macro2::TokenStream;
use quote::{ToTokens, quote};
use syn::{
    Block, Ident, Result, Stmt, Token,
    parse::{Parse, ParseStream},
};

use crate::dryer::Dryer;

pub struct SecadorMultiMacro {
    pub stmts: Vec<Stmt>,
}

impl ToTokens for SecadorMultiMacro {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        let Self { stmts: statements } = self;
        tokens.extend(quote! {
          #(#statements)*
        });
    }
}

impl Parse for SecadorMultiMacro {
    fn parse(input: ParseStream) -> Result<Self> {
        let mut dryers: Vec<Dryer> = vec![];
        while input.peek(Ident) {
            dryers.push(input.parse()?);
            input.parse::<Token![,]>()?;
        }

        let mut block: Block = input.parse()?;

        for mut dryer in dryers {
            block = dryer.try_dry_block(block)?;
        }

        Ok(Self { stmts: block.stmts })
    }
}