assemblist 1.3.0

Define your builder patterns as you use them.
Documentation
use proc_macro2::TokenStream;
use quote::ToTokens;
use syn::{
    parse::{Parse, ParseStream},
    Result, Token, Visibility,
};

use super::attribute::{AttributeBlock, DocumentationBlock};

pub struct Prelude {
    pub attr_block: AttributeBlock,
    pub vis: Visibility,
    pub asyncness: Option<Token![async]>,
}

pub struct Intro {
    pub doc_block: DocumentationBlock,
    pub attr_block: AttributeBlock,
    pub vis: Visibility,
    pub asyncness: Option<Token![async]>,
}

impl Parse for Intro {
    fn parse(input: ParseStream) -> Result<Self> {
        let mut attr_block: AttributeBlock = input.parse()?;
        let doc_block = DocumentationBlock::extract_from(&mut attr_block);
        let vis: Visibility = input.parse()?;
        let asyncness: Option<Token![async]> = input.parse()?;
        Ok(Self {
            doc_block,
            attr_block,
            vis,
            asyncness,
        })
    }
}

impl ToTokens for Prelude {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        self.attr_block.to_tokens(tokens);
        self.vis.to_tokens(tokens);
        self.asyncness.to_tokens(tokens);
    }
}

impl Intro {
    pub fn split(self) -> (Prelude, DocumentationBlock) {
        let prelude = Prelude {
            attr_block: self.attr_block,
            vis: self.vis,
            asyncness: self.asyncness,
        };
        (prelude, self.doc_block)
    }
}