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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
use std::io::{self, Write};

const COLOR_RESET: &'static str = "\x1b[0m";
const COLOR_RED: &'static str = "\x1b[31m";
const COLOR_GREEN: &'static str = "\x1b[32m";
const COLOR_YELLOW: &'static str = "\x1b[33m";
const COLOR_BLUE: &'static str = "\x1b[34m";
const COLOR_MAGENTA: &'static str = "\x1b[35m";
const COLOR_CYAN: &'static str = "\x1b[36m";

pub struct Printer {

}

impl Printer {
    pub fn new() -> Printer {
        Printer {

        }
    }

    fn echo(&self, msg: &str) {
        let stdout = io::stdout();
        let mut handle = stdout.lock();

        let res = handle.write_all(msg.as_bytes());
        res.unwrap();
    }
    pub fn print(&self, msg: &str) -> &Printer {
        self.echo(msg);
        return self;
    }
    pub fn print_color(&self, color: &str, msg: &str) -> &Printer {
        self.echo(color);
        self.print(msg);
        self.echo(COLOR_RESET);

        return self;
    }
    pub fn print_ln(&self, msg: &str) -> &Printer {
        return self.print(msg).print("\n");
    }
    pub fn print_color_ln(&self, color: &str, msg: &str) -> &Printer {
        self.print_color(color, msg);
        return self.print_ln("");
    }
    pub fn print_red(&self, msg: &str) -> &Printer {
        return self.print_color(COLOR_RED, msg);
    }
    pub fn print_red_ln(&self, msg: &str) -> &Printer {
        return self.print_color_ln(COLOR_RED, msg);
    }
    pub fn print_green(&self, msg: &str) -> &Printer {
        return self.print_color(COLOR_GREEN, msg);
    }
    pub fn print_green_ln(&self, msg: &str) -> &Printer {
        return self.print_color_ln(COLOR_GREEN, msg);
    }
    pub fn print_yellow(&self, msg: &str) -> &Printer {
        return self.print_color(COLOR_YELLOW, msg);
    }
    pub fn print_yellow_ln(&self, msg: &str) -> &Printer {
        return self.print_color_ln(COLOR_YELLOW, msg);
    }
    pub fn print_blue(&self, msg: &str) -> &Printer {
        return self.print_color(COLOR_BLUE, msg);
    }
    pub fn print_blue_ln(&self, msg: &str) -> &Printer {
        return self.print_color_ln(COLOR_BLUE, msg);
    }
    pub fn print_magenta(&self, msg: &str) -> &Printer {
        return self.print_color(COLOR_MAGENTA, msg);
    }
    pub fn print_magenta_ln(&self, msg: &str) -> &Printer {
        return self.print_color_ln(COLOR_MAGENTA, msg);
    }
    pub fn print_cyan(&self, msg: &str) -> &Printer {
        return self.print_color(COLOR_CYAN, msg);
    }
    pub fn print_cyan_ln(&self, msg: &str) -> &Printer {
        return self.print_color_ln(COLOR_CYAN, msg);
    }

    pub fn print_space(&self) -> &Printer {
        return self.print(" ");
    }
    pub fn print_utc_time(&self) -> &Printer {
        // TODO
        return self;
    }
    pub fn print_pad_right(&self) -> &Printer {
        // TODO
        return self;
    }
    pub fn print_pad_left(&self) -> &Printer {
        // TODO
        return self;
    }

    
    fn set_color(&self, color: &str) -> &Printer {
        self.echo(color);
        return self;
    }
    pub fn reset(&self) -> &Printer {
        return self.set_color(COLOR_RESET);
    }
    pub fn set_color_red(&self) -> &Printer {
        return self.set_color(COLOR_RED);
    }
    pub fn set_color_green(&self) -> &Printer {
        return self.set_color(COLOR_GREEN);
    }
    pub fn set_color_yellow(&self) -> &Printer {
        return self.set_color(COLOR_YELLOW);
    }
    pub fn set_color_blue(&self) -> &Printer {
        return self.set_color(COLOR_BLUE);
    }
    pub fn set_color_magenta(&self) -> &Printer {
        return self.set_color(COLOR_MAGENTA);
    }
    pub fn set_color_cyan(&self) -> &Printer {
        return self.set_color(COLOR_CYAN);
    }
}

pub fn lazer() -> Printer {
    let printer = Printer::new();
    printer.reset();
    return printer;
}