Skip to main content

pistonite_pm/
util.rs

1/// Bail with a `syn::Error`. Use from a function that returns `syn::Result`.
2#[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/// Flatten an expansion result or error into token stream.
13///
14/// This is used at the top-level to convert result from expansion implementation
15/// to the return value expected by Rust
16#[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/// Convenience wrapper for parsing punctuated syntax
25#[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
33/// Convenience wrapper for parsing punctuated syntax
34pub 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}