initial commit

This commit is contained in:
Tristan Ancelet
2026-02-22 12:04:09 -06:00
commit 1f629ad6e1
8 changed files with 212 additions and 0 deletions

114
src/logger.cr Normal file
View File

@@ -0,0 +1,114 @@
require "time"
require "colorize"
module Logger
annotation LoggerWatcher
end
struct LOG_LEVEL
getter value : Int32
getter color : Symbol
delegate in?, to: @value
def initialize(@value : Int32, @color : Symbol)
end
{% for op, i in %w[ < > == <= >= ] %}
def {{op.id}} (other : LOG_LEVEL)
@value {{op.id}} other.value
end
{% end %}
end
LOG_LEVELS = {
DEBUG: LOG_LEVEL.new(value: 0, color: :green),
INFO: LOG_LEVEL.new(value: 1, color: :blue),
WARN: LOG_LEVEL.new(value: 2, color: :yellow),
ERROR: LOG_LEVEL.new(value: 3, color: :red),
FATAL: LOG_LEVEL.new(value: 4, color: :red)
}
@@min_level : LOG_LEVEL = LOG_LEVELS[:INFO]
@@max_level : LOG_LEVEL = LOG_LEVELS[:FATAL]
@@debug : Bool = false
LOG_MUTEX = ::Mutex.new
macro generate_log_line(message)
{% _def = @def %}
{% _class = @type %}
{% _type = @type.module? ? "Module" : "Class" %}
{% if _class && _class.name.stringify != "Logger" && _def %}
"{{_type.id}}({{_class.name.id}})" + " : " + "Method({{_def.name}})" + " : " + {{message}}
{% elsif _class && _class.name.stringify != "Logger" %}
"{{_type.id}}({{_class.name.id}})" + " : " + {{message}}
{% elsif _def %}
"Method({{_def.name}})" + " : " + {{message}}
{% else %}
{{message}}
{% end %}
end
macro debug(message)
::Logger.log :DEBUG, Logger.generate_log_line({{message}})
end
macro info(message)
::Logger.log :INFO, Logger.generate_log_line({{message}})
end
macro error(message)
::Logger.log :ERROR, Logger.generate_log_line({{message}})
end
macro warn(message)
::Logger.log :WARN, Logger.generate_log_line({{message}})
end
macro fatal(message)
::Logger.log :FATAL, Logger.generate_log_line({{message}})
end
{% for level, i in %w[ min max ] %}
def self.{{level.id}}=(level : Symbol)
synchronize {
@@{{level.id}}_level = LOG_LEVELS[level] if LOG_LEVELS.keys.includes? level
}
Logger.debug "Logger : {{level.id}}= : Minimum log level set to #{level}"
end
{% end %}
protected def self.synchronize(&block : -> )
LOG_MUTEX.synchronize do
yield
end
end
def self.debug? : Bool
LOG_MUTEX.synchronize do
@@debug
end
end
def self.valid?(level : LOG_LEVEL) : Bool
level.in?(@@min_level.value..@@max_level.value)
end
def self.debug= (state : Bool) : Nil
synchronize {
@@debug = state
}
Logger.debug "Debug set to #{state}"
end
def self.log(level : Symbol, message : String)
_level = LOG_LEVELS[level]
if valid?(_level) || debug?
synchronize {
time = Time.local
STDERR.puts [time, level.to_s.colorize(_level.color), message].join(" : ")
}
end
end
end