pub( crate ) mod private
{
use crate::exposed::*;
use type_constructor::prelude::*;
pub trait AsMuchAsPossibleNoDelimiter {}
types!
{
#[ derive( Debug, PartialEq, Eq, Clone, Default ) ]
pub pair Pair : < T1 : syn::parse::Parse + quote::ToTokens, T2 : syn::parse::Parse + quote::ToTokens >
}
impl< T1, T2 > Pair< T1, T2 >
where
T1 : syn::parse::Parse + quote::ToTokens,
T2 : syn::parse::Parse + quote::ToTokens,
{
pub fn new( src1 : T1, src2 : T2 ) -> Self
{
Self( src1, src2 )
}
}
impl< T1, T2 > syn::parse::Parse for Pair< T1, T2 >
where
T1 : syn::parse::Parse + quote::ToTokens,
T2 : syn::parse::Parse + quote::ToTokens,
{
fn parse( input : ParseStream< '_ > ) -> Result< Self >
{
Ok( Self( input.parse()?, input.parse()? ) )
}
}
impl< T1, T2 > quote::ToTokens for Pair< T1, T2 >
where
T1 : syn::parse::Parse + quote::ToTokens,
T2 : syn::parse::Parse + quote::ToTokens,
{
fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream )
{
self.0.to_tokens( tokens );
self.1.to_tokens( tokens );
}
}
types!
{
#[ derive( Debug, PartialEq, Eq, Clone, Default ) ]
pub many Many : < T : quote::ToTokens >
}
impl< T > Many< T >
where
T : quote::ToTokens + syn::parse::Parse,
{
pub fn new() -> Self
{
Self( Vec::new() )
}
pub fn new_with( src : Vec< T > ) -> Self
{
Self( src )
}
}
impl< T > From< Many< T > > for Vec< T >
where
T : quote::ToTokens + syn::parse::Parse,
{
fn from( src : Many< T > ) -> Self
{
src.0
}
}
impl< T > quote::ToTokens
for Many< T >
where
T : quote::ToTokens + syn::parse::Parse,
{
fn to_tokens( &self, tokens : &mut proc_macro2::TokenStream )
{
use crate::quote::TokenStreamExt;
tokens.append_all( self.0.iter() );
}
}
impl< T > syn::parse::Parse
for Many< T >
where
T : quote::ToTokens + syn::parse::Parse + AsMuchAsPossibleNoDelimiter,
{
fn parse( input : syn::parse::ParseStream< '_ > ) -> Result< Self >
{
let mut items = vec![];
while !input.is_empty()
{
let item : T = input.parse()?;
items.push( item );
}
Ok( Self( items ) )
}
}
impl syn::parse::Parse
for Many< AttributesInner >
{
fn parse( input : ParseStream< '_ > ) -> Result< Self >
{
let mut result = Self::new();
loop
{
if !input.peek( Token![ # ] )
{
break;
}
result.0.push( input.parse()? );
}
Ok( result )
}
}
impl syn::parse::Parse
for Many< AttributesOuter >
{
fn parse( input : ParseStream< '_ > ) -> Result< Self >
{
let mut result = Self::new();
loop
{
if !input.peek( Token![ # ] )
{
break;
}
result.0.push( input.parse()? );
}
Ok( result )
}
}
impl AsMuchAsPossibleNoDelimiter for syn::Item {}
}
#[ doc( inline ) ]
pub use exposed::*;
pub mod exposed
{
#[ doc( inline ) ]
pub use super::prelude::*;
#[ doc( inline ) ]
pub use super::private::
{
Pair,
Many,
};
}
pub mod prelude
{
#[ doc( inline ) ]
pub use super::private::
{
AsMuchAsPossibleNoDelimiter,
};
}