use proc_macro2::TokenStream;
use quote::ToTokens;
use std::marker::PhantomData;
use syn::parse::{Parse, ParseStream};
use syn::Attribute;
#[cfg(feature = "attributed")]
pub type AttributedInner<T = TokenStream> = Attributed<T, kind::Inner>;
#[cfg(feature = "attributed")]
pub struct Attributed<T = TokenStream, K = kind::Outer> {
pub attributes: Vec<Attribute>,
pub data: T,
_kind: PhantomData<K>,
}
impl<T: Parse> Attributed<T> {
#[allow(clippy::missing_errors_doc)]
pub fn parse_outer(input: ParseStream) -> syn::Result<Self> {
Ok(Self::new(Attribute::parse_outer(input)?, input.parse()?))
}
}
impl<T: Parse> AttributedInner<T> {
#[allow(clippy::missing_errors_doc)]
pub fn parse_inner(input: ParseStream) -> syn::Result<Self> {
Ok(Self::new(Attribute::parse_inner(input)?, input.parse()?))
}
}
impl<T, K> Attributed<T, K> {
#[inline]
fn new(attributes: Vec<Attribute>, data: T) -> Self {
Self {
attributes,
data,
_kind: PhantomData,
}
}
}
impl<T: ToTokens, K> ToTokens for Attributed<T, K> {
fn to_tokens(&self, tokens: &mut TokenStream) {
for attr in &self.attributes {
attr.to_tokens(tokens);
}
self.data.to_tokens(tokens);
}
}
impl<T: Parse> Parse for Attributed<T> {
#[inline]
fn parse(input: ParseStream) -> syn::Result<Self> {
Self::parse_outer(input)
}
}
impl<T: Parse> Parse for AttributedInner<T> {
#[inline]
fn parse(input: ParseStream) -> syn::Result<Self> {
Self::parse_inner(input)
}
}
#[allow(missing_docs)]
mod kind {
pub struct Outer;
pub struct Inner;
}