use crate::constants::{AGENT_DIR, AGENT_LOG_DIR, AGENT_LOG_ERROR, AGENT_LOG_INFO, DATA_DIR};
use chrono::Local;
use std::fs::{self, OpenOptions};
use std::io::Write;
use std::path::PathBuf;
#[macro_export]
macro_rules! info {
($($arg:tt)*) => {{
println!($($arg)*)
}};
}
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {{
use colored::Colorize;
eprint!("{}", "[ERROR] ".red());
eprintln!($($arg)*)
}};
}
#[macro_export]
macro_rules! usage {
($($arg:tt)*) => {{
use colored::Colorize;
print!("{}", "💡 Usage: ".green());
println!($($arg)*)
}};
}
#[macro_export]
macro_rules! debug_log {
($config:expr, $($arg:tt)*) => {{
if $config.is_verbose() {
println!($($arg)*)
}
}};
}
pub fn capitalize_first_letter(s: &str) -> String {
let mut chars = s.chars();
match chars.next() {
None => String::new(),
Some(c) => c.to_uppercase().collect::<String>() + chars.as_str(),
}
}
pub fn write_info_log(context: &str, content: &str) {
let log_dir = dirs::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(DATA_DIR)
.join(AGENT_DIR)
.join(AGENT_LOG_DIR);
if let Err(e) = fs::create_dir_all(&log_dir) {
eprintln!("无法创建日志目录: {}", e);
return;
}
let log_file = log_dir.join(AGENT_LOG_INFO);
match OpenOptions::new().create(true).append(true).open(&log_file) {
Ok(mut file) => {
let timestamp = Local::now().format("%Y-%m-%d %H:%M:%S");
let log_entry = format!(
"\n========================================\n[{}] {}\n{}\n",
timestamp, context, content
);
if let Err(e) = file.write_all(log_entry.as_bytes()) {
eprintln!("写入信息日志失败: {}", e);
}
}
Err(e) => {
eprintln!("无法打开信息日志文件: {}", e);
}
}
}
pub fn write_error_log(context: &str, error: &str) {
let log_dir = dirs::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(DATA_DIR)
.join(AGENT_DIR)
.join(AGENT_LOG_DIR);
if let Err(e) = fs::create_dir_all(&log_dir) {
eprintln!("无法创建日志目录: {}", e);
return;
}
let log_file = log_dir.join(AGENT_LOG_ERROR);
match OpenOptions::new().create(true).append(true).open(&log_file) {
Ok(mut file) => {
let timestamp = Local::now().format("%Y-%m-%d %H:%M:%S");
let log_entry = format!(
"\n========================================\n[{}] {}\n错误详情:\n{}\n",
timestamp, context, error
);
if let Err(e) = file.write_all(log_entry.as_bytes()) {
eprintln!("写入错误日志失败: {}", e);
}
}
Err(e) => {
eprintln!("无法打开错误日志文件: {}", e);
}
}
}