1#[macro_export]
3macro_rules! bail {
4 ($tokens:expr, $msg:expr) => {
5 return Err($crate::lib::syn::Error::new_spanned($tokens, $msg))
6 };
7 ($tokens:expr, $($tt:tt)*) => {
8 return Err($crate::lib::syn::Error::new_spanned($tokens, format!($($tt)*)))
9 };
10}
11
12#[cfg(feature = "proc-macro")]
17pub fn flatten<T: crate::ToTokens>(result: syn::Result<T>) -> crate::TokenStream {
18 match result {
19 Ok(x) => x.into_token_stream().into(),
20 Err(e) => e.into_compile_error().into(),
21 }
22}
23
24#[cfg(feature = "proc-macro")]
26pub fn parse_punctuated<T: syn::parse::Parse, P: syn::parse::Parse>(
27 input: crate::TokenStream,
28) -> syn::Result<syn::punctuated::Punctuated<T, P>> {
29 let pun: Punctuated<T, P> = syn::parse(input)?;
30 Ok(pun.0)
31}
32
33pub fn parse_punctuated2<T: syn::parse::Parse, P: syn::parse::Parse>(
35 input: crate::TokenStream2,
36) -> syn::Result<syn::punctuated::Punctuated<T, P>> {
37 let pun: Punctuated<T, P> = syn::parse2(input)?;
38 Ok(pun.0)
39}
40
41struct Punctuated<T, P>(syn::punctuated::Punctuated<T, P>);
42impl<T: syn::parse::Parse, P: syn::parse::Parse> syn::parse::Parse for Punctuated<T, P> {
43 fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
44 let parts = syn::punctuated::Punctuated::<T, P>::parse_terminated(input)?;
45 Ok(Self(parts))
46 }
47}