1use colored::{ColoredString, Colorize};
2use log::{Level, LevelFilter};
3use std::io::Write;
4use chrono::Local;
5use std::sync::Once;
6
7static INIT: Once = Once::new();
8
9pub fn init(level: LevelFilter) {
11 INIT.call_once(|| {
12 env_logger::Builder::new()
13 .format(|buf, record| {
14 let timestamp = Local::now().format("%Y-%m-%d %H:%M:%S").to_string();
16
17 let level_str = match record.level() {
19 Level::Error => "ERROR".red().bold(),
20 Level::Warn => "WARN ".yellow().bold(),
21 Level::Info => "INFO ".green(),
22 Level::Debug => "DEBUG".blue(),
23 Level::Trace => "TRACE".magenta(),
24 };
25
26 let target = if let Some(target) = record.module_path() {
28 if target.contains("::") {
29 let parts: Vec<&str> = target.split("::").collect();
30 let prefix = parts[0];
31 let suffix = parts.last().unwrap_or(&"");
32 format!("{}.{}", prefix, suffix)
33 } else {
34 target.to_string()
35 }
36 } else {
37 "pocket".to_string()
38 };
39
40 writeln!(
42 buf,
43 "{} {} {} > {}",
44 timestamp.dimmed(),
45 level_str,
46 target.dimmed(),
47 record.args()
48 )
49 })
50 .filter(None, level)
51 .init();
52
53 log::info!("Logger initialized at level {}", level);
54 });
55}
56
57pub fn info(msg: &str) {
59 println!("{} {}", "INFO".green(), msg);
60}
61
62pub fn success(msg: &str) {
64 println!("{} {}", "SUCCESS".green().bold(), msg);
65}
66
67pub fn warning(msg: &str) {
69 println!("{} {}", "WARNING".yellow().bold(), msg);
70}
71
72pub fn error(msg: &str) {
74 eprintln!("{} {}", "ERROR".red().bold(), msg);
75}
76
77pub fn cmd_text(cmd: &str, args: &[&str]) -> ColoredString {
79 format!("{} {}", cmd, args.join(" ")).cyan()
80}
81
82pub fn header(text: &str) -> ColoredString {
84 text.blue().bold()
85}
86
87pub fn key(text: &str) -> ColoredString {
89 text.yellow()
90}
91
92pub fn value(text: &str) -> ColoredString {
94 text.white()
95}
96
97pub fn path(text: &str) -> ColoredString {
99 text.underline().white()
100}
101
102pub fn id(text: &str) -> ColoredString {
104 text.green()
105}
106
107pub fn title(text: &str) -> ColoredString {
109 text.cyan().bold()
110}