mini_internal/
bound.rs

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 = &param.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}