cgp-macro-lib 0.7.0

Context-generic programming core component macros implemented as a library.
Documentation
use alloc::collections::BTreeMap;
use alloc::string::{String, ToString};

use proc_macro2::TokenStream;
use quote::{ToTokens, quote};
use syn::parse::{Parse, ParseStream};
use syn::punctuated::Punctuated;
use syn::token::{Bracket, Colon, Comma};
use syn::{Ident, Type, bracketed};

pub struct Entry {
    pub key: Ident,
    pub value: TokenStream,
}

impl Parse for Entry {
    fn parse(input: ParseStream) -> syn::Result<Self> {
        let key = input.parse()?;
        let _colon: Colon = input.parse()?;
        let value = if input.peek(Bracket) {
            let body;
            bracketed!(body in input);
            let inner: TokenStream = body.parse()?;
            quote! { [ #inner ] }
        } else {
            input.parse::<Type>()?.to_token_stream()
        };

        Ok(Entry { key, value })
    }
}

pub struct Entries {
    pub entries: BTreeMap<String, TokenStream>,
}

impl Parse for Entries {
    fn parse(input: ParseStream) -> syn::Result<Self> {
        let entry_list: Punctuated<Entry, Comma> = Punctuated::parse_terminated(input)?;

        let entries = BTreeMap::from_iter(
            entry_list
                .into_iter()
                .map(|entry| (entry.key.to_string(), entry.value)),
        );

        Ok(Entries { entries })
    }
}