clashctl 0.3.2

Cli & Tui used to interact with Clash RESTful API
use clap_generate::Shell;
use env_logger::fmt::Color;
use env_logger::Builder;
use log::{Level, LevelFilter};
use std::{env, path::PathBuf};

pub fn detect_shell() -> Option<Shell> {
    match env::var("SHELL") {
        Ok(shell) => PathBuf::from(shell)
            .file_name()
            .and_then(|name| name.to_str())
            .and_then(|name| name.parse().ok()),
        Err(_) => None,
    }
}

pub fn init_logger(level: Option<LevelFilter>) {
    let mut builder = Builder::new();

    if let Some(lf) = level {
        builder.filter_level(lf);
    } else if let Ok(s) = ::std::env::var("CLASHCTL_LOG") {
        builder.parse_filters(&s);
    } else {
        builder.filter_level(LevelFilter::Info);
    }

    builder.format(|f, record| {
        use std::io::Write;
        let mut style = f.style();

        let level = match record.level() {
            Level::Trace => style.set_color(Color::Magenta).value("Trace"),
            Level::Debug => style.set_color(Color::Blue).value("Debug"),
            Level::Info => style.set_color(Color::Green).value(" Info"),
            Level::Warn => style.set_color(Color::Yellow).value(" Warn"),
            Level::Error => style.set_color(Color::Red).value("Error"),
        };

        writeln!(f, " {} > {}", level, record.args(),)
    });

    builder.init()
}