1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
/**
 * Copyright (c) 2019, Jesús Rubio <jesusprubio@member.fsf.org>
 *
 * This source code is licensed under the MIT License found in
 * the LICENSE.txt file in the root directory of this source tree.
 */
use colored::*;

/// Create a custom logger.
///
/// * `tag` - String to use as prefix (after scope).
/// * `message` - String to print.
/// * `scope` - Preffix to append.
/// * `ln` - Use `eprintln` instead `eprint` (default: true).
pub fn custom(tag: &ColoredString, message: &str, scope: Option<&str>, ln: Option<bool>) {
    let pref = match scope {
        None => "".to_string(),
        Some(p) => format!("[{}]", p),
    };

    let to_print = format!("{} {} {}", pref.dimmed(), tag, message);

    match ln {
        Some(false) => eprint!("{}", to_print),
        _ => eprintln!("{}", to_print),
    }
}

/// Simple header/title for CLIs.
///
/// * `name` - Name of the project.
/// * `version` - Include also the version.
pub fn head(name: &str, icon: Option<&str>, version: Option<&str>) {
    let ver = match version {
        None => "".to_string(),
        Some(v) => format!("\n\t(v{})\n", v),
    };

    let ico = match icon {
        None => "",
        Some(i) => i,
    };

    eprintln!("\n\t{} {}{} ", ico, name.bold().underline(), ver.dimmed());
}

/// Informational message.
///
/// * `message` - String to print.
/// * `scope` - Preffix to append.
/// * `ln` - To print in the same line instead  (default: false).
pub fn info(message: &str, scope: Option<&str>, ln: Option<bool>) {
    custom(&"ℹ".blue().bold(), message, scope, ln);
}

/// Succesfull operation.
///
/// * `message` - String to print.
/// * `scope` - Preffix to append.
/// * `ln` - To print in the same line instead  (default: false).
pub fn success(message: &str, scope: Option<&str>, ln: Option<bool>) {
    custom(&"✔".green().bold(), message, scope, ln);
}

/// Warn message.
///
/// * `message` - String to print.
/// * `scope` - Preffix to append.
/// * `ln` - To print in the same line instead  (default: false).
pub fn warn(message: &str, scope: Option<&str>, ln: Option<bool>) {
    custom(&"âš ".yellow().bold(), message, scope, ln);
}

/// Error message.
///
/// * `message` - String to print.
/// * `scope` - Preffix to append.
/// * `ln` - To print in the same line instead  (default: false).
pub fn error(message: &str, scope: Option<&str>, ln: Option<bool>) {
    custom(&"✖".red().bold(), message, scope, ln);
}

/// Waiting for something.
///
/// * `message` - String to print.
/// * `scope` - Preffix to append.
/// * `ln` - To print in the same line instead  (default: false).
pub fn wait(message: &str, scope: Option<&str>, ln: Option<bool>) {
    custom(&"…".magenta().bold(), message, scope, ln);
}

/// Something finished.
///
/// * `message` - String to print.
/// * `scope` - Preffix to append.
/// * `ln` - To print in the same line instead  (default: false).
pub fn done(message: &str, scope: Option<&str>, ln: Option<bool>) {
    custom(&"☒".cyan().bold(), message, scope, ln);
}

/// Put the cursor at the init of the actual line.
pub fn remove() {
    eprint!("\r");
}