Property definitions

logger $ Logger :: defaultinit
# A simple logging utility
#
# `Logger` provides a simple way to output messages from applications.
#
# Each message is associated with a level that indicate its severity.
# Only messages with a severity equal to or higher than the logger `level`
# threshold will be displayed.
#
# ~~~
# var logger = new Logger(warn_level)
# assert logger.unknown("unkown")
# assert logger.fatal("fatal")
# assert logger.error("error")
# assert logger.warn("warn")
# assert not logger.info("info")
# assert not logger.debug("debug")
# ~~~
class Logger

	# Severity threshold
	#
	# Messages with a severity level greater than or equal to `level` will be displayed.
	# Default is `warn_level`.
	#
	# See `unknown_level`, `fatal_level`, error_level``, `warn_level`,
	# `info_level` and `debug_level`.
	var level: Int = warn_level is optional, writable

	# Kind of `Writer` used to output messages
	type OUT: Writer

	# Writer used to output messages
	#
	# Default is `stderr`.
	var out: OUT = stderr is optional

	# Formatter used to format messages before outputting them
	#
	# By default no formatter is used.
	#
	# See `DefaultFormatter`.
	var default_formatter: nullable Formatter = null is optional, writable

	# Output a message with `level` severity
	#
	# Only output messages with `level` severity greater than of equal to `self.level`.
	#
	# ~~~
	# var stderr = new StringWriter
	# var logger = new Logger(warn_level, stderr, null)
	#
	# # This message will be displayed:
	# assert logger.warn("This is a warning.")
	# assert stderr.to_s.trim.split("\n").last == "This is a warning."
	#
	# # This message will not:
	# assert not logger.info("This is some info.")
	# assert stderr.to_s.trim.split("\n").last == "This is a warning."
	# ~~~
	#
	# Each logger can be given a default formatter used to format the messages
	# before outputting them:
	#
	# ~~~
	# var formatter = new DefaultFormatter(no_color = true)
	# logger = new Logger(warn_level, stderr, formatter)
	# logger.warn("This is a warning.")
	# assert stderr.to_s.trim.split("\n").last == "Warning: This is a warning."
	# ~~~
	#
	# Optionally, a `Formatter` can be given to replace the `default_formatter`
	# used by default.
	#
	# ~~~
	# # Create a formatter with no default decorator
	# logger = new Logger(warn_level, stderr, null)
	#
	# # Display a message without any formatter
	# logger.warn("This is a warning.")
	# assert stderr.to_s.trim.split("\n").last == "This is a warning."
	#
	# # Display a message with a custom formatter
	# logger.warn("This is a warning.", formatter)
	# assert stderr.to_s.trim.split("\n").last == "Warning: This is a warning."
	# ~~~
	fun add(level: Int, message: Writable, formatter: nullable Formatter): Bool do
		var format = formatter or else default_formatter
		if format == null then
			return add_raw(level, message)
		end
		return add_raw(level, format.format(level, message))
	end

	# Output a message with `level` severity without formatting it
	#
	# Only output messages with `level` severity greater than of equal to `self.level`.
	#
	# ~~~
	# var stderr = new StringWriter
	# var logger = new Logger(warn_level, stderr, null)
	#
	# # This message will be displayed:
	# assert logger.add_raw(warn_level, "This is a warning.")
	# assert stderr.to_s.trim.split("\n").last == "This is a warning."
	#
	# # This message will not:
	# assert not logger.add_raw(info_level, "This is some info.")
	# assert stderr.to_s.trim.split("\n").last == "This is a warning."
	# ~~~
	fun add_raw(level: Int, message: Writable): Bool do
		if level < self.level then return false
		out.write(message.write_to_string)
		out.write("\n")
		return true
	end

	# Output a message with `unknown_level` severity
	#
	# Unkown severity messages are always outputted.
	fun unknown(message: String, formatter: nullable Formatter): Bool do
		return add(unknown_level, message, formatter)
	end

	# Output a message with `fatal_level` severity
	fun fatal(message: String, formatter: nullable Formatter): Bool do
		return add(fatal_level, message, formatter)
	end

	# Output a message with `error_level` severity
	fun error(message: String, formatter: nullable Formatter): Bool do
		return add(error_level, message, formatter)
	end

	# Output a message with `warn_level` severity
	fun warn(message: String, formatter: nullable Formatter): Bool do
		return add(warn_level, message, formatter)
	end

	# Output a message with `info_level` severity
	fun info(message: String, formatter: nullable Formatter): Bool do
		return add(info_level, message, formatter)
	end

	# Output a message with `debug` severity
	fun debug(message: String, formatter: nullable Formatter): Bool do
		return add(debug_level, message, formatter)
	end
end
lib/logger/logger.nit:115,1--262,3