lib/bashly/concerns/validation_helpers.rb
module Bashly
# This is a `ConfigValidator` concern responsible for providing basic
# assertion methods.
module ValidationHelpers
protected
def assert(valid, message)
raise ConfigurationError, message unless valid
end
def refute(invalid, message)
assert !invalid, message
end
def assert_string(key, value)
assert value.is_a?(String), "#{key} must be a string"
end
def assert_optional_string(key, value)
assert_string key, value if value
end
def assert_boolean(key, value)
assert [true, false, nil].include?(value), "#{key} must be a boolean"
end
def assert_array(key, value, of: nil)
return unless value
assert value.is_a?(Array), "#{key} must be an array"
return unless of
value.each_with_index do |val, i|
send :"assert_#{of}", "#{key}[#{i}]", val
end
end
def assert_hash(key, value, keys: nil)
assert value.is_a?(Hash), "#{key} must be a hash"
return unless keys
invalid_keys = (value.keys.map(&:to_sym) - keys).reject { |k| k.start_with? 'x_' }
assert invalid_keys.empty?, "#{key} contains invalid options: #{invalid_keys.join ', '}"
end
def assert_uniq(key, value, array_keys)
return unless value
array_keys = [array_keys] unless array_keys.is_a? Array
list = []
array_keys.each do |array_key|
list += value.filter_map { |c| c[array_key] }.flatten
end
nonuniqs = list.nonuniq
assert nonuniqs.empty?, "#{key} contains non-unique elements (#{nonuniqs.join ', '}) in #{array_keys.join ' or '}"
end
def assert_string_or_array(key, value)
return unless value
assert [Array, String].include?(value.class),
"#{key} must be a string or an array"
assert_array key, value, of: :string if value.is_a? Array
end
end
end