Sha256: 767cfe4c6c118ed4d634ec420eaa05a8dc47c853d2b3ff1edd41f05ec22a8813

Contents?: true

Size: 1.89 KB

Versions: 4

Compression:

Stored size: 1.89 KB

Contents

# frozen_string_literal: true

module Leftovers
  module MatcherBuilders
    module NodeValue
      class << self
        def build(patterns)
          Or.each_or_self(patterns) do |pattern|
            case pattern
            when ::Integer, ::Float, true, false then Matchers::NodeScalarValue.new(pattern)
            # matching scalar on nil will fall afoul of compact and each_or_self etc.
            when :_leftovers_nil_value then Matchers::NodeType.new(:nil)
            when ::String then NodeName.build(pattern)
            when ::Hash then build_from_hash(**pattern)
            # :nocov:
            else raise UnexpectedCase, "Unhandled value #{pattern.inspect}"
              # :nocov:
            end
          end
        end

        private

        def build_node_name_matcher(names, match, has_prefix, has_suffix)
          Or.build([
            NodeName.build(names),
            NodeName.build(match: match, has_prefix: has_prefix, has_suffix: has_suffix)
          ])
        end

        def build_node_has_argument_matcher(has_arguments, at, has_value)
          Or.build([
            NodeHasArgument.build(has_arguments),
            NodeHasArgument.build(at: at, has_value: has_value)
          ])
        end

        def build_from_hash( # rubocop:disable Metrics/ParameterLists
          has_arguments: nil, at: nil, has_value: nil,
          names: nil, match: nil, has_prefix: nil, has_suffix: nil,
          type: nil,
          has_receiver: nil,
          literal: nil,
          unless_arg: nil
        )
          And.build([
            build_node_has_argument_matcher(has_arguments, at, has_value),
            build_node_name_matcher(names, match, has_prefix, has_suffix),
            NodeType.build(type),
            NodeHasReceiver.build(has_receiver),
            NodeValue.build(literal),
            Unless.build(build(unless_arg))
          ])
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
leftovers-0.12.2 lib/leftovers/matcher_builders/node_value.rb
leftovers-0.12.1 lib/leftovers/matcher_builders/node_value.rb
leftovers-0.12.0 lib/leftovers/matcher_builders/node_value.rb
leftovers-0.11.2 lib/leftovers/matcher_builders/node_value.rb