use proc_macro2::{Ident, TokenStream};
use quote::quote;
pub(crate) const FRESH_PREFIX: &str = "_Param_";
pub(crate) const FRESH_SUFFIX: &str = "_BatchGen_";
pub(crate) fn fresh_param(g: usize, i: usize) -> TokenStream {
let name = format!("{}{}_{}{}", FRESH_PREFIX, g, i, FRESH_SUFFIX);
let ident = Ident::new(&name, proc_macro2::Span::call_site());
quote!(#ident)
}
pub(crate) fn at_ref_name(lit: &str) -> Option<String> {
if let Ok(n) = lit.parse::<usize>() {
return Some(format!("{}{}{}", FRESH_PREFIX, n, FRESH_SUFFIX));
}
if let Some((g, i)) = lit.split_once('_')
&& let (Ok(g), Ok(i)) = (g.parse::<usize>(), i.parse::<usize>())
{
return Some(format!("{}{}_{}{}", FRESH_PREFIX, g, i, FRESH_SUFFIX));
}
None
}
pub(crate) fn parse_grouped_fresh(s: &str) -> Option<(usize, usize)> {
let rest = s.strip_prefix(FRESH_PREFIX)?.strip_suffix(FRESH_SUFFIX)?;
let (g, i) = rest.split_once('_')?;
Some((g.parse().ok()?, i.parse().ok()?))
}
pub(crate) fn parse_numbered_fresh(s: &str) -> Option<usize> {
let rest = s.strip_prefix(FRESH_PREFIX)?.strip_suffix(FRESH_SUFFIX)?;
rest.parse().ok()
}
pub(crate) fn is_fresh_name(s: &str) -> bool {
s.starts_with(FRESH_PREFIX) && s.ends_with(FRESH_SUFFIX)
}