From 1eb72f9943c1dd98f3a3985368b08d6439b06967 Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Thu, 14 Aug 2025 15:22:54 +0200 Subject: [PATCH] Feat: Baut eine eigene Log-Funktion. --- Cargo.toml | 2 ++ src/log.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 9 ++++++- 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/log.rs diff --git a/Cargo.toml b/Cargo.toml index 117b445..bf5f5a6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,5 +2,7 @@ name = "SmartMount" version = "0.1.0" edition = "2024" +authors = ['DragonSlayer_14'] [dependencies] +time = { version="0.3.41", features = ["formatting", "macros", "local-offset"] } diff --git a/src/log.rs b/src/log.rs new file mode 100644 index 0000000..0ce9168 --- /dev/null +++ b/src/log.rs @@ -0,0 +1,73 @@ +use std::any::Any; +use std::fmt::{Display, Formatter}; +use std::io::{IsTerminal, stdout}; +use std::sync::OnceLock; +use time::{OffsetDateTime, macros::format_description}; + +#[derive(PartialEq)] +pub enum LogLevel { + Error = 1, + Warn = 2, + Info = 3, + Debug = 4, +} + +impl Display for LogLevel { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + LogLevel::Error => write!(f, "ERROR"), + LogLevel::Warn => write!(f, "WARN"), + LogLevel::Info => write!(f, "INFO"), + LogLevel::Debug => write!(f, "DEBUG"), + } + } +} + +static IS_TERMINAL: OnceLock = OnceLock::new(); +static LOG_LEVEL: LogLevel = LogLevel::Debug; // TODO: LogLevel aus Config laden + +pub fn log(tag: &str, message: &str, log_level: LogLevel) { + if log_level.type_id() >= LOG_LEVEL.type_id() { + let message: String = format_message(tag, message, &log_level); + + if is_terminal() { + if log_level == LogLevel::Error { + eprintln!("{}", message) + } else { + println!("{}", message) + } + } + } +} + +fn is_terminal() -> bool { + *IS_TERMINAL.get_or_init(|| stdout().is_terminal()) +} + +fn format_message(tag: &str, message: &str, log_level: &LogLevel) -> String { + let mut prefix: String = String::new(); + + let now_local: OffsetDateTime = + OffsetDateTime::now_local().unwrap_or(OffsetDateTime::now_utc()); + let fmt = + format_description!("[day].[month].[year] [hour]:[minute]:[second].[subsecond digits:3]"); + + if tag != "" { + prefix = format!("[{}]", tag); + } + + let message = format!( + "[{}][{}][{}]: {}", + now_local.format(fmt).unwrap(), + log_level.to_string(), + prefix, + message + ); + + match log_level { + &LogLevel::Error => format!("{}{}", "🛑", message), + &LogLevel::Warn => format!("{}{}", "âš ī¸", message), + &LogLevel::Info => format!("{}{}", "â„šī¸", message), + &LogLevel::Debug => format!("{}{}", "🚧", message), + } +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..641bdcc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,10 @@ +use crate::log::LogLevel; + +mod log; + fn main() { - println!("Hello, world!"); + log::log("main", "Hello, world!", LogLevel::Error); + log::log("main", "Hello, world!", LogLevel::Warn); + log::log("main", "Hello, world!", LogLevel::Info); + log::log("main", "Hello, world!", LogLevel::Debug); }