bat-cli 0.9.0

Blockchain Auditor Toolkit (BAT)
use colored::{ColoredString, Colorize};
use inflector::Inflector;
use std::cell::RefCell;
use std::fmt::{Debug, Display};
use std::rc::Rc;
use strum::IntoEnumIterator;

pub mod analytics;
pub mod bat_dialoguer;
pub mod command_line;
pub mod git;
pub mod metadata;
pub mod miro;
pub mod parser;
pub mod path;
pub mod silicon;
pub mod sonar;
pub mod templates;

pub type ShareableDataType<T> = Rc<RefCell<T>>;

#[derive(Clone)]
pub struct ShareableData<T>
where
    T: Sized + Clone,
{
    pub original: ShareableDataType<T>,
    pub cloned: ShareableDataType<T>,
}

impl<T> ShareableData<T>
where
    T: Sized + Clone,
{
    pub fn new(data_to_share: T) -> Self {
        let original = Rc::new(RefCell::new(data_to_share));
        let cloned = Rc::clone(&original);
        Self { original, cloned }
    }
}

pub trait BatEnumerator
where
    Self: ToString + Display + IntoEnumIterator + Clone + Sized + Debug,
{
    fn to_snake_case(&self) -> String {
        self.to_string().to_snake_case()
    }

    fn to_sentence_case(&self) -> String {
        self.to_string().to_sentence_case()
    }

    fn from_str(type_str: &str) -> Self {
        let structs_type_vec = Self::get_type_vec();

        structs_type_vec
            .into_iter()
            .find(|struct_type| struct_type.to_snake_case() == type_str.to_snake_case())
            .unwrap()
    }

    fn from_index(index: usize) -> Self {
        Self::get_type_vec()[index].clone()
    }

    fn get_index_of_type_vec(&self) -> usize {
        let type_vec = Self::get_type_vec();
        type_vec
            .into_iter()
            .position(|self_type| self_type.to_string() == self.to_string())
            .unwrap()
    }

    fn get_type_vec() -> Vec<Self> {
        Self::iter().collect::<Vec<_>>()
    }

    fn get_colored_name(&self, to_plural: bool) -> ColoredString {
        let self_name = if to_plural {
            self.to_string().to_plural()
        } else {
            self.to_string()
        };

        let colorized_vec = Self::get_colorized_type_vec(to_plural);

        colorized_vec
            .into_iter()
            .find(|color| color.contains(&self_name))
            .unwrap()
    }

    fn colored_from_index(type_str: &str, idx: usize) -> ColoredString {
        match idx {
            0 => type_str.bright_green(),
            1 => type_str.bright_blue(),
            2 => type_str.bright_yellow(),
            3 => type_str.bright_cyan(),
            4 => type_str.bright_purple(),
            _ => type_str.bright_white(),
        }
    }

    fn get_colorized_type_vec(to_plural: bool) -> Vec<ColoredString> {
        let metadata_type_vec = Self::get_type_vec();
        let metadata_type_colorized = metadata_type_vec
            .iter()
            .enumerate()
            .map(|metadata_type| {
                if to_plural {
                    Self::colored_from_index(
                        &(*metadata_type.1).to_string().to_plural(),
                        metadata_type.0,
                    )
                } else {
                    Self::colored_from_index(&(*metadata_type.1).to_string(), metadata_type.0)
                }
            })
            .collect::<Vec<_>>();
        metadata_type_colorized
    }
}