lib/command_line_boss/logger_options.rb



# frozen_string_literal: true

class CommandLineBoss
  # Add --debug and --verbose options and a logger method
  module LoggerOptions
    # true if the --debug option was given
    #
    # @return [Boolean]
    #
    # @api private
    #
    attr_reader :debug

    # true if the --verbose option was given
    #
    # @return [Boolean]
    #
    # @api private
    #
    attr_reader :verbose

    # The logger to use to report progress
    #
    # Messages are logged at info and debug levels. The logger returned is one of
    # the following:
    #
    # * A logger that logs to the console at the :info level if verbose mode is enabled
    # * A logger that logs to the console at the :debug level if debug mode is enabled
    # * Otherwise a null logger that does not log anything
    #
    # @example
    #   options.logger #=> #<Logger:0x00007f9e3b8b3e08>
    #
    # @return [Logger]
    #
    def logger
      @logger ||=
        if verbose
          verbose_logger
        elsif debug
          debug_logger
        else
          Logger.new(nil, level: Logger::UNKNOWN + 1)
        end
    end

    private

    # Define the --verbose option
    #
    # @return [void]
    #
    # @api private
    #
    def define_verbose_option
      parser.on('-v', '--verbose', 'Enable verbose mode (default is off)') do |verbose|
        @verbose = verbose
      end
    end

    # Define the --debug option
    #
    # @return [void]
    #
    # @api private
    #
    def define_debug_option
      parser.on('-D', '--debug', 'Enable debug mode default is off') do |debug|
        @debug = debug
      end
    end

    # Ensure that the --debug and --verbose options are not both given
    #
    # @return [void]
    #
    # @api private
    #
    def validate_debug_verbose_option
      add_error_message('Can not give both --debug and --verbose') if debug && verbose
    end

    # A Logger that logs to the console at the :debug level with a simple formatter
    #
    # @return [Logger]
    #
    # @api private
    #
    def debug_logger
      Logger.new($stdout, level: 'debug', formatter: ->(_severity, _datetime, _progname, msg) { "#{msg}\n" })
    end

    # A Logger that logs to the console at the :info level with a simple formatter
    #
    # @return [Logger]
    #
    # @api private
    #
    def verbose_logger
      Logger.new($stdout, level: 'info', formatter: ->(_severity, _datetime, _progname, msg) { "#{msg}\n" })
    end
  end
end