use proc_macro2::Span;
use syn::spanned::Spanned;
pub(crate) fn default_db_lifetime(span: Span) -> syn::Lifetime {
syn::Lifetime {
apostrophe: span,
ident: syn::Ident::new("db", span),
}
}
pub(crate) fn require_optional_db_lifetime(generics: &syn::Generics) -> syn::Result<()> {
if generics.params.is_empty() {
return Ok(());
}
require_db_lifetime(generics)?;
Ok(())
}
pub(crate) fn require_db_lifetime(generics: &syn::Generics) -> syn::Result<()> {
if generics.params.is_empty() {
return Err(syn::Error::new_spanned(
generics,
"this definition must have a `'db` lifetime",
));
}
for (param, index) in generics.params.iter().zip(0..) {
let error = match param {
syn::GenericParam::Lifetime(_) => index > 0,
syn::GenericParam::Type(_) | syn::GenericParam::Const(_) => true,
};
if error {
return Err(syn::Error::new_spanned(
param,
"only a single lifetime parameter is accepted",
));
}
}
Ok(())
}
pub(crate) fn db_lifetime(generics: &syn::Generics) -> syn::Lifetime {
if let Some(lt) = generics.lifetimes().next() {
lt.lifetime.clone()
} else {
default_db_lifetime(generics.span())
}
}
pub(crate) fn require_no_generics(generics: &syn::Generics) -> syn::Result<()> {
if let Some(param) = generics.params.iter().next() {
return Err(syn::Error::new_spanned(
param,
"generic parameters not allowed here",
));
}
Ok(())
}