#![allow(dead_code)]
use proc_macro2::TokenStream;
use quote::quote;
use syn::{Error, Result, parse::ParseStream};
pub fn compile_error(message: &str) -> TokenStream {
let msg = message;
quote! {
compile_error!(#msg);
}
}
pub fn parse_comma_separated<T>(
input: ParseStream,
parse_fn: impl Fn(ParseStream) -> Result<T>,
) -> Result<Vec<T>> {
let mut items = Vec::new();
while !input.is_empty() {
items.push(parse_fn(input)?);
if !input.is_empty() {
let _comma: syn::Token![,] = input
.parse()
.map_err(|_| Error::new(input.span(), "expected comma between arguments"))?;
if input.is_empty() {
break;
}
}
}
Ok(items)
}
pub fn unique_ident(prefix: &str, index: usize) -> syn::Ident {
syn::Ident::new(
&format!("__{prefix}_{index}"),
proc_macro2::Span::call_site(),
)
}
pub fn wrap_once_cell(expr: &syn::Expr, ident: &syn::Ident) -> TokenStream {
quote! {
let #ident = #expr;
}
}