Sha256: 4fd60850378d342e80d49e0eddeb25a2100fa1a9b0dfbbceff71f533d03a53c2

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true

module Leftovers
  class ValueRule
    def initialize(values) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity
      literal_values = Set.new
      value_types = Set.new

      Array.each_or_self(values) do |value|
        case value
        when Hash
          raise ArgumentError, "invalid value #{value.inspect}" unless value[:type]

          value_types.merge(
            Array(value[:type]).map do |v|
              case v
              when 'String', :String then :str
              when 'Symbol', :Symbol then :sym
              else v.to_s.downcase.to_sym
              end
            end
          )
        else
          (literal_values << value) if value
        end
      end

      if literal_values.length <= 1
        @literal_value = literal_values.first
        @literal_values = nil
      else
        @literal_value = nil
        @literal_values = literal_values
      end

      if value_types.length <= 1
        @value_type = value_types.first
        @value_types = nil
      else
        @value_type = nil
        @value_types = value_types
      end

      freeze
    end

    def match?(value_node) # rubocop:disable Metrics/CyclomaticComplexity
      return true if @value_type&.== value_node.type
      return true if @value_types&.include?(value_node.type)
      return false unless (@literal_value || @literal_values) && value_node.scalar?
      return true if @literal_value&.== value_node.to_scalar_value

      @literal_values&.include?(value_node.to_scalar_value)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
leftovers-0.1.0 lib/leftovers/value_rule.rb