stock-trek 0.7.3

Stock Trek time-series analysis
Documentation
use quote::ToTokens;
use std::collections::BTreeSet;

pub fn last_segment_name<T>() -> &'static str {
    std::any::type_name::<T>()
        .split(':')
        .next_back()
        .unwrap_or("")
}

pub fn path_string(path: &syn::Path) -> String {
    path.segments
        .to_token_stream()
        .into_iter()
        .map(|token| token.to_string())
        .collect::<Vec<_>>()
        .join("")
}

pub fn collate(tree: &syn::UseTree) -> BTreeSet<String> {
    let mut paths = BTreeSet::new();
    collate_with_prefix(tree, &mut paths, String::new());
    paths
}

fn collate_with_prefix(tree: &syn::UseTree, paths: &mut BTreeSet<String>, prefix: String) {
    match tree {
        syn::UseTree::Path(syn::UsePath { ident, tree, .. }) => {
            let new_prefix = if prefix.is_empty() {
                ident.to_string()
            } else {
                format!("{}::{}", prefix, ident)
            };
            collate_with_prefix(tree, paths, new_prefix);
        }
        syn::UseTree::Group(syn::UseGroup { items, .. }) => {
            for item in items {
                collate_with_prefix(item, paths, prefix.clone());
            }
        }
        syn::UseTree::Name(syn::UseName { ident }) => {
            let full = if prefix.is_empty() {
                ident.to_string()
            } else {
                format!("{}::{}", prefix, ident)
            };
            paths.insert(full);
        }
        syn::UseTree::Rename(syn::UseRename { ident, .. }) => {
            let full = if prefix.is_empty() {
                ident.to_string()
            } else {
                format!("{}::{}", prefix, ident)
            };
            paths.insert(full);
        }
        syn::UseTree::Glob(syn::UseGlob { .. }) => {
            let full = if prefix.is_empty() {
                "*".to_string()
            } else {
                format!("{}::*", prefix)
            };
            paths.insert(full);
        }
    }
}