Casey Rodarmor 173c0e5ac5
Initial commit of the data crate
The `data` crate is intended to be used as the manifest serialization
and deserialization format.

This blog post describes the motivation and goals for this crate:

    https://rodarmor.com/blog/data

type: added
2020-05-10 21:38:59 -07:00

29 lines
780 B
Rust

use crate::common::*;
pub(crate) trait Attribute: FromMeta {
type Item: syn::parse::Parse;
fn attribute(
attr: proc_macro::TokenStream,
item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
Self::inner(attr.into(), item.into()).tokens().into()
}
fn inner(attr: TokenStream, item: TokenStream) -> Result<TokenStream, Error> {
let args = Punctuated::<NestedMeta, token::Comma>::parse_terminated
.parse2(attr)?
.into_iter()
.collect();
Self::innermost(args, item)
}
fn innermost(args: Vec<NestedMeta>, item: TokenStream) -> Result<TokenStream, Error> {
let item = syn::parse2::<Self::Item>(item)?;
Self::from_list(&args)?.expand(item)
}
fn expand(&self, item: Self::Item) -> Result<TokenStream, Error>;
}