Sha256: 5a6c995ec4cdab2bf12649d8039a21dc725f1945588f81e4f1f2db37880463b7

Contents?: true

Size: 1.75 KB

Versions: 40

Compression:

Stored size: 1.75 KB

Contents

# Class represents a terraspace option that is possibly callable. Examples:
#
#    config.allow.envs
#    config.allow.regions
#    config.deny.envs
#    config.deny.regions
#    config.all.include_stacks
#    config.all.exclude_stacks
#
# Abstraction is definitely obtuse. Using it to get rid of duplication.
#
class Terraspace::App
  class CallableOption
    include Terraspace::Util::Logging

    def initialize(options={})
      @options = options
      # Example:
      # config_name:  config.allow.envs
      # config_value: ["dev"]
      # args:         [@stack_name] # passed to object.call
      @config_name = options[:config_name]
      @config_value = options[:config_value]
      @passed_args = options[:passed_args]
    end

    # Returns either an Array or nil
    def object
      case @config_value
      when nil
        return nil
      when Array
        return @config_value
      when -> (c) { c.respond_to?(:public_instance_methods) && c.public_instance_methods.include?(:call) }
        object= @config_value.new
      when -> (c) { c.respond_to?(:call) }
        object = @config_value
      else
        raise "Invalid option for #{@config_name}"
      end

      if object
        result = @passed_args.empty? ? object.call : object.call(*@passed_args)
        unless result.is_a?(Array) || result.is_a?(NilClass)
          message = "ERROR: The #{@config_name} needs to return an Array or nil"
          logger.info message.color(:yellow)
          logger.info <<~EOL
            The #{@config_name} when assigned a class, object, or proc must implement
            the call method and return an Array or nil.
            The current return value is a #{result.class}
          EOL
          raise message
        end
      end
      result
    end
  end
end

Version data entries

40 entries across 40 versions & 1 rubygems

Version Path
terraspace-2.2.17 lib/terraspace/app/callable_option.rb
terraspace-2.2.16 lib/terraspace/app/callable_option.rb
terraspace-2.2.15 lib/terraspace/app/callable_option.rb
terraspace-2.2.14 lib/terraspace/app/callable_option.rb
terraspace-2.2.13 lib/terraspace/app/callable_option.rb
terraspace-2.2.12 lib/terraspace/app/callable_option.rb
terraspace-2.2.11 lib/terraspace/app/callable_option.rb
terraspace-2.2.10 lib/terraspace/app/callable_option.rb
terraspace-2.2.9 lib/terraspace/app/callable_option.rb
terraspace-2.2.8 lib/terraspace/app/callable_option.rb
terraspace-2.2.7 lib/terraspace/app/callable_option.rb
terraspace-2.2.6 lib/terraspace/app/callable_option.rb
terraspace-2.2.5 lib/terraspace/app/callable_option.rb
terraspace-2.2.4 lib/terraspace/app/callable_option.rb
terraspace-2.2.3 lib/terraspace/app/callable_option.rb
terraspace-2.2.2 lib/terraspace/app/callable_option.rb
terraspace-2.2.1 lib/terraspace/app/callable_option.rb
terraspace-2.2.0 lib/terraspace/app/callable_option.rb
terraspace-2.1.7 lib/terraspace/app/callable_option.rb
terraspace-2.1.6 lib/terraspace/app/callable_option.rb