require 'exceptions/validation_error'
class RunListArrayValidator < ActiveModel::EachValidator

  RUN_LIST_REGEX = /\A(role|recipe)\[[\w-]+(::[\w-]+)?\]\Z/

  def validate_each(record, attribute, valueArray)
    unless valueArray.empty?
      invalid_elements = valueArray.select {|l| (RUN_LIST_REGEX =~ l).nil?}
      record.errors.add attribute, (options[:message] || "Invalid values: '#{invalid_elements.join("', '")}'") unless invalid_elements.empty?
    end
  end

  def self.validate_list list
    raise Devops::Exception::ValidationError.new nil, {type: "Is not an array"} unless list.is_a?(Array)
    unless list.empty?
      invalid_elements = list.select{|l| (RUN_LIST_REGEX =~ l).nil?}
      raise Devops::Exception::ValidationError.new(nil, elements: invalid_elements) unless invalid_elements.empty?
    end
  end

end
