vimwiki_macros 0.1.0

Macro library that provides macros to generate vimwiki language at compile time.
Documentation
use crate::tokens::{utils::root_crate, Tokenize, TokenizeContext};
use proc_macro2::TokenStream;
use quote::quote;
use vimwiki_core::{
    Definition, DefinitionList, DefinitionListValue, Located, Term,
};

impl_tokenize!(tokenize_definition_list, DefinitionList<'a>, 'a);
fn tokenize_definition_list(
    ctx: &TokenizeContext,
    definition_list: &DefinitionList,
) -> TokenStream {
    let root = root_crate();
    let td = definition_list
        .iter()
        .map(|x| tokenize_term_and_definitions(ctx, x));
    quote! {
        <#root::DefinitionList as ::std::iter::FromIterator<
            (
                #root::Located<#root::Term>,
                ::std::vec::Vec<#root::Located<#root::Definition>>,
            )
        >>::from_iter(::std::vec![#(#td),*])
    }
}

fn tokenize_term_and_definitions(
    ctx: &TokenizeContext,
    (term, definitions): (&Located<Term>, &[Located<Definition>]),
) -> TokenStream {
    let term = do_tokenize!(ctx, term);
    let definitions = definitions.iter().map(|x| do_tokenize!(ctx, x));
    quote! {
        (#term, ::std::vec![#(#definitions),*])
    }
}

impl_tokenize!(tokenize_definition_list_value, DefinitionListValue<'a>, 'a);
fn tokenize_definition_list_value(
    ctx: &TokenizeContext,
    definition_list_value: &DefinitionListValue,
) -> TokenStream {
    let root = root_crate();
    let inner = do_tokenize!(ctx, definition_list_value.as_inner());
    quote! {
        #root::DefinitionListValue::new(#inner)
    }
}