Method: Sfn::CommandModule::Template::InstanceMethods#request_compile_parameter

Defined in:
lib/sfn/command_module/template.rb

#request_compile_parameter(p_name, p_config, cur_val, nested = false) ⇒ Object

Request compile time parameter value

Parameters:

  • p_name (String, Symbol)

    name of parameter

  • p_config (Hash)

    parameter meta information

  • cur_val (Object, NilClass)

    current value assigned to parameter

  • nested (TrueClass, FalseClass) (defaults to: false)

    template is nested

Options Hash (p_config):

  • :type (String, Symbol)
  • :default (String, Symbol)
  • :description (String, Symbol)
  • :multiple (String, Symbol)

Returns:

  • (Object)


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/sfn/command_module/template.rb', line 48

def request_compile_parameter(p_name, p_config, cur_val, nested = false)
  result = nil
  attempts = 0
  parameter_type = p_config.fetch(:type, "string").to_s.downcase.to_sym
  if parameter_type == :complex
    ui.debug "Compile time parameter `#{p_name}` is a complex type. Not requesting value from user."
    if cur_val.nil?
      raise ArgumentError.new "No value provided for `#{p_name}` parameter (Complex data type)"
    else
      cur_val
    end
  else
    unless cur_val || p_config[:default].nil?
      cur_val = p_config[:default]
    end
    if cur_val.is_a?(Array)
      cur_val = cur_val.map(&:to_s).join(",")
    end
    until result && (!result.respond_to?(:empty?) || !result.empty?)
      attempts += 1
      if config[:interactive_parameters] && (!nested || !p_config.key?(:prompt_when_nested) || p_config[:prompt_when_nested] == true)
        result = ui.ask_question(
          p_name.to_s.split("_").map(&:capitalize).join,
          :default => cur_val.to_s.empty? ? nil : cur_val.to_s,
        )
      else
        result = cur_val.to_s
      end
      case parameter_type
      when :string
        if p_config[:multiple]
          result = result.split(",").map(&:strip)
        end
      when :number
        if p_config[:multiple]
          result = result.split(",").map(&:strip)
          new_result = result.map do |item|
            new_item = item.to_i
            new_item if new_item.to_s == item
          end
          result = new_result.size == result.size ? new_result : []
        else
          new_result = result.to_i
          result = new_result.to_s == result ? new_result : nil
        end
      else
        raise ArgumentError.new "Unknown compile time parameter type provided: `#{p_config[:type].inspect}` (Parameter: #{p_name})"
      end
      valid = validate_parameter(result, p_config.to_smash)
      unless valid == true
        result = nil
        valid.each do |invalid_msg|
          ui.error "#{p_name}: #{invalid_msg.last}"
        end
      end
      if result.nil? || (result.respond_to?(:empty?) && result.empty?)
        if attempts > MAX_PARAMETER_ATTEMPTS
          ui.fatal "Failed to receive allowed parameter! (Parameter: #{p_name})"
          exit 1
        end
      end
    end
    result
  end
end