Sha256: 89ec930466fdfad8ef17d7024a3b90fff30f531a2864a4e410d8e2813903f344

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

require "mono_logger"
module Queuel
  class Configurator
    InvalidConfigurationError = Class.new StandardError
    private
    attr_accessor :option_values

    def self.option_values
      @option_values ||= {}
    end

    def self.define_param_accessors(param_name)
      define_method param_name do |*values|
        value = values.first
        value ? self.send("#{param_name}=", value) : retrieve(param_name)
      end
      define_method "#{param_name}=" do |value|
        validate!(param_name, value) &&
          instance_variable_set("@#{param_name}", value)
      end
    end

    def validate(param_name, value)
      validator = self.class.option_values[param_name].fetch(:validate) { {} }[:validator] || ->(val) { true }
      validator.call value
    end

    def validate!(param_name, value)
      message = self.class.option_values[param_name].fetch(:validate) { {} }[:message]
      message ||= "#{value} is not a valid value for #{param_name}"
      validate(param_name, value) || raise(InvalidConfigurationError, message)
    end

    def retrieve(param)
      if instance_variable_defined?("@#{param}")
        instance_variable_get("@#{param}")
      else
        self.class.option_values[param][:default]
      end
    end

    def self.param(param_name, options = {})
      attr_accessor param_name
      self.option_values[param_name] = options
      define_param_accessors param_name
      public param_name
      public "#{param_name}="
    end

    public

    param :credentials
    param :engine
    param :default_queue
    param :receiver_threads, default: 1
    param :logger, default: MonoLogger.new(STDOUT), validate: {
      message: "Logger must respond to #{%w[info warn debug level level]}",
      validator: ->(logger) {
        %w[info warn debug level].all? { |msg| logger.respond_to? msg } &&
          logger.respond_to?(:level)
      }
    }
    param :log_level, default: MonoLogger::ERROR
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
queuel-0.1.0 lib/queuel/configurator.rb