1use proc_macro2::{Span, TokenStream};
2use syn::punctuated::Punctuated;
3use syn::{
4 parse_quote, GenericParam, Generics, Lifetime, LifetimeParam, TypeParamBound, WhereClause,
5 WherePredicate,
6};
7
8pub fn with_lifetime_bound(generics: &Generics, lifetime: &str) -> Generics {
9 let bound = Lifetime::new(lifetime, Span::call_site());
10 let param = LifetimeParam {
11 attrs: Vec::new(),
12 lifetime: bound.clone(),
13 colon_token: None,
14 bounds: Punctuated::new(),
15 };
16
17 let params = Some(GenericParam::Lifetime(param))
18 .into_iter()
19 .chain(generics.params.iter().cloned().map(|mut param| {
20 match &mut param {
21 GenericParam::Lifetime(param) => {
22 param.bounds.push(bound.clone());
23 }
24 GenericParam::Type(param) => {
25 param.bounds.push(TypeParamBound::Lifetime(bound.clone()));
26 }
27 GenericParam::Const(_) => {}
28 }
29 param
30 }))
31 .collect();
32
33 Generics {
34 params,
35 ..generics.clone()
36 }
37}
38
39pub fn where_clause_with_bound(generics: &Generics, bound: TokenStream) -> WhereClause {
40 let new_predicates = generics.type_params().map::<WherePredicate, _>(|param| {
41 let param = ¶m.ident;
42 parse_quote!(#param : #bound)
43 });
44
45 let mut generics = generics.clone();
46 generics
47 .make_where_clause()
48 .predicates
49 .extend(new_predicates);
50 generics.where_clause.unwrap()
51}