""" Utility classes for TiOP. """ import sys from typing import NoReturn from enum import IntEnum class Colors: """ANSI color codes for terminal output.""" RED = '\033[0;31m' GREEN = '\033[0;32m' YELLOW = '\033[1;33m' BLUE = '\033[0;34m' NC = '\033[0m' # No Color class LogLevel(IntEnum): """Log levels ordered by severity.""" TRACE = 0 INFO = 1 SUCCESS = 2 WARN = 3 ERROR = 4 class Logger: """Simple logging utility with configurable log level.""" # Class variable to store current log level _level: LogLevel = LogLevel.INFO @classmethod def set_level(cls, level: LogLevel): """Set the minimum log level to display.""" cls._level = level @classmethod def get_level(cls) -> LogLevel: """Get the current log level.""" return cls._level @staticmethod def trace(msg: str): if Logger._level <= LogLevel.TRACE: print(f"[TRACE] {msg}", file=sys.stderr) @staticmethod def info(msg: str): if Logger._level <= LogLevel.INFO: print(f"{Colors.BLUE}[INFO]{Colors.NC} {msg}", file=sys.stderr) @staticmethod def success(msg: str): if Logger._level <= LogLevel.SUCCESS: print(f"{Colors.GREEN}[SUCCESS]{Colors.NC} {msg}", file=sys.stderr) @staticmethod def warn(msg: str): if Logger._level <= LogLevel.WARN: print(f"{Colors.YELLOW}[WARN]{Colors.NC} {msg}", file=sys.stderr) @staticmethod def error(msg: str): if Logger._level <= LogLevel.ERROR: print(f"{Colors.RED}[ERROR]{Colors.NC} {msg}", file=sys.stderr) @staticmethod def die(msg: str) -> NoReturn: Logger.error(msg) sys.exit(1)