lib/gamefic/scanner.rb
# frozen_string_literal: true require 'gamefic/scanner/result' require 'gamefic/scanner/base' require 'gamefic/scanner/strict' require 'gamefic/scanner/fuzzy' require 'gamefic/scanner/nesting' require 'gamefic/scanner/fuzzy_nesting' module Gamefic # A module for matching objects to tokens. # module Scanner DEFAULT_PROCESSORS = [Nesting, Strict, FuzzyNesting, Fuzzy].freeze # Scan entities against a token. # # @param selection [Array<Entity>] # @param token [String] # @param use [Array<Class<Scanner::Base>>] # @return [Result, nil] def self.scan(selection, token, use = processors) result = nil use.each do |processor| result = processor.scan(selection, token) break result unless result.matched.empty? end result end # Select the scanner processors to use in entity queries. Each processor # will be used in order until one of them returns matches. The default # processor list is `DEFAULT_PROCESSORS`. # # Processor classes should be in order from most to least strict rules # for matching tokens to entities. # # @param klasses [Array<Class<Scanner::Base>>] # @return [Array<Class<Scanner::Base>>] def self.use *klasses processors.replace klasses.flatten end # @return [Array<Class<Base>>] def self.processors @processors ||= [] end # A measure of a scan processor's strictness based on its order of use. # Higher values indicate higher strictness. # # @return [Integer] def self.strictness(processor) (processors.length - (processors.find_index(processor) || processors.length)) * 100 end use DEFAULT_PROCESSORS end end