#!/usr/bin/env bash # ============================================ # Core # ============================================ LOG_LEVEL=${LOG_LEVEL:-INFO} # ============================================ # Internal # ============================================ function internal::get_log_priority() { case "$1" in DEBUG) echo 0 ;; INFO) echo 1 ;; WARN) echo 2 ;; ERROR) echo 3 ;; SUCCESS) echo 4 ;; *) echo 1 ;; esac } function internal::log() { local level="$1" shift local current_priority local message_priority current_priority=$(internal::get_log_priority "$LOG_LEVEL") message_priority=$(internal::get_log_priority "$level") if (( message_priority < current_priority )); then return 0 fi case "$level" in DEBUG) color="\033[0;37m" ;; # cyan INFO) color="\033[1;34m" ;; # blue WARN) color="\033[1;33m" ;; # yellow ERROR) color="\033[1;31m" ;; # red SUCCESS)color="\033[1;32m" ;; # red esac echo -e "${color}=> ${level}:\033[0m $*" } function internal::icon() { local context="$1" local action="$2" case "$context:$action" in docker:log) echo "🐳 " ;; docker:start) echo "🟢 🐳 " ;; docker:stop) echo "🔴 🐳 " ;; docker:success) echo "✅ 🐳 " ;; docker:warning) echo "⚠️ 🐳 " ;; docker:error) echo "❌ 🐳 " ;; docker:logs) echo "📜 🐳 " ;; docker:list) echo "🔍 🐳 " ;; docker:build) echo "📦 🐳 " ;; build:log) echo "🏗️ " ;; build:start) echo "🟢 🏗️ " ;; build:stop) echo "🔴 🏗️ " ;; build:success) echo "✅ 🏗️ " ;; build:warning) echo "⚠️ 🏗️ " ;; build:error) echo "❌ 🏗️ " ;; network:log) echo "🌐 " ;; network:setup) echo "⚙️ 🌐 " ;; network:stop) echo "🔴 🌐 " ;; network:success) echo "✅ 🌐 " ;; network:warning) echo "⚠️ 🌐 " ;; network:error) echo "❌ 🌐 " ;; auth:log) echo "🔑 " ;; auth:setup) echo "⚙️ 🔑 " ;; auth:login) echo "🔐 🔑 " ;; auth:success) echo "✅ 🔑 " ;; auth:warning) echo "⚠️ 🔑 " ;; auth:error) echo "❌ 🔑 " ;; env:log) echo "⚙️ " ;; env:load) echo "📥 ⚙️ " ;; env:success) echo "✅ ⚙️ " ;; env:warning) echo "⚠️ ⚙️ " ;; env:error) echo "❌ ⚙️ " ;; fs:log) echo "📁 " ;; fs:read) echo "📥 📁 " ;; fs:write) echo "📤 📁 " ;; fs:success) echo "✅ 📁 " ;; fs:warning) echo "⚠️ 📁 " ;; fs:error) echo "❌ 📁 " ;; db:log) echo "🗄️ " ;; db:start) echo "🟢 🗄️ " ;; db:migrate) echo "📜 🗄️ " ;; db:success) echo "✅ 🗄️ " ;; db:warning) echo "⚠️ 🗄️ " ;; db:error) echo "❌ 🗄️ " ;; log:info) echo "🔹 " ;; log:warn) echo "⚠️ " ;; log:error) echo "❌ " ;; log:success) echo "✅ " ;; log:debug) echo "🔍 " ;; *) echo "🔹" ;; esac } function internal::get_context_icon() { case "$1" in docker) echo "🐳" ;; build) echo "🏗️" ;; network) echo "🌐" ;; auth) echo "🔑" ;; env) echo "⚙️" ;; fs) echo "📁" ;; db) echo "🗄️" ;; *) echo "🔹" ;; esac } # ============================================ # Loggers # ============================================ function internal::log::info() { internal::log INFO "$*"; } function internal::log::warn() { internal::log WARN "$*"; } function internal::log::error() { internal::log ERROR "$*"; } function internal::log::success() { internal::log SUCCESS "$*"; } function internal::log::debug() { internal::log DEBUG "$*"; } # ============================================ # Context Loggers # ============================================ function log::context() { local context="$1" local action="$2" shift 2 internal::log::info "$(internal::icon "$context" "$action") $*" } function log::warn_context() { local context="$1" local action="$2" shift 2 internal::log::warn "$(internal::icon "$context" "$action") $*" } function log::error_context() { local context="$1" local action="$2" shift 2 internal::log::error "$(internal::icon "$context" "$action") $*" } function log::success_context() { local context="$1" local action="$2" shift 2 internal::log::success "$(internal::icon "$context" "$action") $*" } function log::debug_context() { local context="$1" local action="$2" shift 2 internal::log::debug "$(internal::icon "$context" "$action") $*" } # ============================================ # Logger Helpers # ============================================ function log::info() { log::context log info "$@"; } function log::warn() { log::warn_context log warn "$@"; } function log::error() { log::error_context log error "$@"; } function log::success() { log::context log success "$@"; } function log::debug() { log::debug_context log debug "$@"; } function log::docker() { log::context docker log "$@"; } function log::docker_start() { log::context docker start "$@"; } function log::docker_stop() { log::context docker stop "$@"; } function log::docker_success() { log::context docker success "$@"; } function log::docker_logs() { log::context docker logs "$@"; } function log::docker_list() { log::context docker list "$@"; } function log::docker_build() { log::context docker build "$@"; } function log::docker_warning() { log::warn_context docker warning "$@"; } function log::docker_error() { log::error_context docker error "$@"; } function log::build() { log::context build log "$@"; } function log::build_start() { log::context build start "$@"; } function log::build_stop() { log::context build stop "$@"; } function log::build_success() { log::context build success "$@"; } function log::build_warning() { log::warn_context build warning "$@"; } function log::build_error() { log::error_context build error "$@"; } function log::network() { log::context network log "$@"; } function log::network_setup() { log::context network setup "$@"; } function log::network_stop() { log::context network stop "$@"; } function log::network_success() { log::context network success "$@"; } function log::network_warning() { log::warn_context network warning "$@"; } function log::network_error() { log::error_context network error "$@"; } function log::auth() { log::context auth log "$@"; } function log::auth_setup() { log::context auth setup "$@"; } function log::auth_login() { log::context auth login "$@"; } function log::auth_success() { log::context auth success "$@"; } function log::auth_warning() { log::warn_context auth warning "$@"; } function log::auth_error() { log::error_context auth error "$@"; } function log::env() { log::context env log "$@"; } function log::env_load() { log::context env load "$@"; } function log::env_success() { log::context env success "$@"; } function log::env_warning() { log::warn_context env warning "$@"; } function log::env_error() { log::error_context env error "$@"; } function log::fs() { log::context fs log "$@"; } function log::fs_read() { log::context fs read "$@"; } function log::fs_write() { log::context fs write "$@"; } function log::fs_success() { log::context fs success "$@"; } function log::fs_warning() { log::warn_context fs warning "$@"; } function log::fs_error() { log::error_context fs error "$@"; } function log::db() { log::context database log "$@"; } function log::db_start() { log::context database start "$@"; } function log::db_migrate() { log::context database migrate "$@"; } function log::db_success() { log::context database success "$@"; } function log::db_warning() { log::warn_context database warning "$@"; } function log::db_error() { log::error_context database error "$@"; } function log::run_step() { local context="$1" local mode="strict" local description shift if [[ "$1" == "soft" || "$1" == "strict" || "$1" == "info" ]]; then mode="$1" shift fi description="$1" shift local icon=$(internal::get_context_icon "$context") if [[ "$mode" == "info" ]]; then internal::log::info "$icon $description" else internal::log::info "🔄 $icon $description" fi "$@" local status=$? # SUCCESS if [[ $status -eq 0 ]]; then if [[ "$mode" == "info" ]]; then return 0 fi internal::log::info "✅ $icon $description" return 0 fi # FAILURE if [[ "$mode" == "soft" || "$mode" == "info" ]]; then internal::log::info "⚠️ $icon $description → skipped" return 0 fi internal::log::info "❌ $icon $description → failed" return $status }