gitlab-ce/lib/gitlab/ci/interpolation/inputs.rb

71 lines
1.5 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module Ci
module Interpolation
# Interpolation inputs provided by the user.
class Inputs
UnknownInputTypeError = Class.new(StandardError)
TYPES = [
StringInput
].freeze
def initialize(specs, args)
@specs = specs.to_h
@args = args.to_h
@inputs = []
@errors = []
validate!
fabricate!
end
def errors
@errors + @inputs.flat_map(&:errors)
end
def valid?
errors.none?
end
def to_hash
@inputs.inject({}) do |hash, input|
hash.merge(input.to_hash)
end
end
private
def validate!
unknown_inputs = @args.keys - @specs.keys
return if unknown_inputs.empty?
@errors.push("unknown input arguments: #{unknown_inputs.join(', ')}")
end
def fabricate!
@specs.each do |input_name, spec|
input_type = TYPES.find { |klass| klass.matches?(spec) }
unless input_type
@errors.push(
"unknown input specification for `#{input_name}` (valid types: #{valid_type_names.join(', ')})")
next
end
@inputs.push(input_type.new(
name: input_name,
spec: spec,
value: @args[input_name]))
end
end
def valid_type_names
TYPES.map(&:type_name)
end
end
end
end
end