five 0.2.6

A rust crate to support DCI natively in rust
Documentation
use syn::Item;

use super::*;

#[derive(Clone)]
pub struct TraitInfo {
    pub name: syn::Ident,
    pub generics: GenericsInfo,
    pub functions: Vec<FunctionDescription>,
    pub attrs: Vec<syn::Attribute>,
    pub supertraits: syn::punctuated::Punctuated<syn::TypeParamBound, syn::Token![+]>,
}

pub fn analyze_trait(item_trait: &syn::ItemTrait) -> TraitInfo {
    let generics = analyze_generics(&Item::Trait(item_trait.clone()));
    let functions = item_trait
        .items
        .iter()
        .filter_map(|item| {
            if let syn::TraitItem::Fn(method) = item {
                let params = analyze_parameters(&method.sig);
                let output = method.sig.output.clone();
                Some(FunctionDescription::Declaration {
                    name: method.sig.ident.clone(),
                    params,
                    generics: analyze_generics_from_method(method),
                    output,
                    asyncness: method.sig.asyncness,
                    attrs: method.attrs.clone(),
                })
            } else {
                None
            }
        })
        .collect();

    TraitInfo {
        name: item_trait.ident.clone(),
        generics,
        functions,
        attrs: item_trait.attrs.clone(),
        supertraits: item_trait.supertraits.clone(),
    }
}