use quote::__private::TokenStream;
use syn::{punctuated::Punctuated, token::Comma, GenericParam, WhereClause};
pub struct Generics {
params: Punctuated<GenericParam, Comma>,
where_clause: Option<WhereClause>,
}
impl Generics {
pub fn with_bounds(&self) -> Option<TokenStream> {
if self.params.is_empty() {
return None;
}
let params = self.params.iter();
Some(quote::quote!(
< #( #params ),* >
))
}
pub fn without_bounds(&self) -> Option<TokenStream> {
if self.params.is_empty() {
return None;
}
let params = self.params.iter().cloned().map(|param| match param {
GenericParam::Type(mut ty) => {
ty.bounds = Punctuated::new();
GenericParam::Type(ty)
},
_ => param,
});
Some(quote::quote!(
< #( #params ),* >
))
}
pub fn where_clause(&self) -> Option<&WhereClause> {
self.where_clause.as_ref()
}
}
impl From<syn::Generics> for Generics {
fn from(generics: syn::Generics) -> Self {
Self {
params: generics.params,
where_clause: generics.where_clause,
}
}
}