jrest_hooks 0.2.3

Jrest `after()`, `after_each()`, `before()`, `before_each()` and `skip()` hooks.
Documentation
//! This code is currently an exact copy of <https://github.com/TomPridham/test-env-helpers> source code.

use std::collections::VecDeque;
use syn::UseTree;

pub fn recurse_use_item<'a>(
    use_tree: &'a UseTree,
    tokens: &mut VecDeque<&str>,
) -> Option<&'a UseTree> {
    let curr_ident = tokens.pop_front().unwrap_or_default();
    match use_tree {
        UseTree::Path(use_stmt_third) => {
            if use_stmt_third.ident == curr_ident {
                recurse_use_item(&*use_stmt_third.tree, tokens)
            } else {
                None
            }
        }
        UseTree::Name(ref use_stmt_third) => {
            if use_stmt_third.ident == curr_ident {
                Some(use_tree)
            } else {
                None
            }
        }
        UseTree::Rename(_) => None,
        UseTree::Glob(_) => None,
        UseTree::Group(ref use_stmt_third) => {
            for item in &use_stmt_third.items {
                tokens.push_front(curr_ident);
                if let Some(group_tree) = recurse_use_item(item, tokens) {
                    return Some(group_tree);
                }
            }
            None
        }
    }
}

pub fn traverse_use_item<'a>(use_tree: &'a UseTree, tokens: Vec<&str>) -> Option<&'a UseTree> {
    let mut tokens = VecDeque::from(tokens);
    recurse_use_item(use_tree, &mut tokens)
}