class Holidays::Finder::Rules::YearRange

Constants

BETWEEN
FROM
LIMITED
UNTIL

Public Class Methods

call(target_year, year_range_defs) click to toggle source
# File lib/holidays/finder/rules/year_range.rb, line 11
def call(target_year, year_range_defs)
  validate!(target_year, year_range_defs)

  operator = year_range_defs.keys.first
  rule_value = year_range_defs[operator]

  case operator
  when UNTIL
    matched = target_year <= rule_value
  when FROM
    matched = target_year >= rule_value
  when LIMITED
    matched = rule_value.include?(target_year)
  when BETWEEN
    matched = rule_value.cover?(target_year)
  else
    matched = false
  end

  matched
end

Private Class Methods

validate!(target_year, year_ranges) click to toggle source
# File lib/holidays/finder/rules/year_range.rb, line 35
def validate!(target_year, year_ranges)
  raise ArgumentError.new("target_year must be a number") unless target_year.is_a?(Integer)
  raise ArgumentError.new("year_ranges cannot be missing") if year_ranges.nil? || year_ranges.empty?
  raise ArgumentError.new("year_ranges must contain a hash with a single operator") unless year_ranges.is_a?(Hash) && year_ranges.size == 1

  operator = year_ranges.keys.first
  value = year_ranges[operator]

  raise ArgumentError.new("Invalid operator found: '#{operator}'") unless [UNTIL, FROM, LIMITED, BETWEEN].include?(operator)

  case operator
  when UNTIL, FROM
    raise ArgumentError.new("#{UNTIL} and #{FROM} operator value must be a number, received: '#{value}'") unless value.is_a?(Integer)
  when LIMITED
    raise ArgumentError.new(":limited operator value must be an array containing at least one integer value, received: '#{value}'") unless value.is_a?(Array) && value.size >= 1 && value.all? { |v| v.is_a?(Integer) }
  when BETWEEN
    raise ArgumentError.new(":between operator value must be a range, received: '#{value}'") unless value.is_a?(Range)
  end
end