Sha256: 8984e40d7f2a3161996795819b39a68853399f76ff1a09fd77a43be94ebd34ae

Contents?: true

Size: 1.27 KB

Versions: 7

Compression:

Stored size: 1.27 KB

Contents

# frozen_string_literal: true

module Mutant

  # Abstract base class for match expression
  class Expression
    include AbstractType, Adamantium::Flat

    fragment             = /[A-Za-z][A-Za-z\d_]*/.freeze
    SCOPE_NAME_PATTERN   = /(?<scope_name>#{fragment}(?:#{SCOPE_OPERATOR}#{fragment})*)/.freeze
    SCOPE_SYMBOL_PATTERN = '(?<scope_symbol>[.#])'.freeze

    private_constant(*constants(false))

    # Syntax of expression
    #
    # @return [String]
    abstract_method :syntax

    # Match length with other expression
    #
    # @param [Expression] other
    #
    # @return [Integer]
    def match_length(other)
      if eql?(other)
        syntax.length
      else
        0
      end
    end

    # Test if expression is prefix
    #
    # @param [Expression] other
    #
    # @return [Boolean]
    def prefix?(other)
      !match_length(other).zero?
    end

    # Try to parse input into expression of receiver class
    #
    # @param [String] input
    #
    # @return [Expression]
    #   when successful
    #
    # @return [nil]
    #   otherwise
    def self.try_parse(input)
      match = self::REGEXP.match(input)
      return unless match
      names = anima.attribute_names
      new(Hash[names.zip(names.map(&match.method(:[])))])
    end

  end # Expression
end # Mutant

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
mutant-0.8.23 lib/mutant/expression.rb
mutant-0.8.22 lib/mutant/expression.rb
mutant-0.8.21 lib/mutant/expression.rb
mutant-0.8.20 lib/mutant/expression.rb
mutant-0.8.19 lib/mutant/expression.rb
mutant-0.8.18 lib/mutant/expression.rb
mutant-0.8.17 lib/mutant/expression.rb