class Fusuma::Config::Searcher

Search config.yml

Attributes

context[R]

Public Class Methods

new() click to toggle source
# File lib/fusuma/config/searcher.rb, line 8
def initialize
  @cache = nil
end

Private Class Methods

conditions(&block) click to toggle source

@return [Hash]

# File lib/fusuma/config/searcher.rb, line 80
def conditions(&block)
  {
    nothing: -> { block.call },
    skip: -> { Config::Searcher.skip { block.call } }
  }
end
fallback(&block) click to toggle source

switch context for fallback

# File lib/fusuma/config/searcher.rb, line 149
def fallback(&block)
  @fallback = true
  result = block.call
  @fallback = false
  result
end
fallback?() click to toggle source
# File lib/fusuma/config/searcher.rb, line 140
def fallback?
  @fallback
end
find_condition(&block) click to toggle source

Execute block with all conditions @return [Array<Symbol, Object>]

# File lib/fusuma/config/searcher.rb, line 96
def find_condition(&block)
  conditions(&block).find do |c, l|
    result = l.call
    return [c, result] if result

    nil
  end
end
find_context(request_context, &block) click to toggle source

Return a matching context from config @params request_context [Hash] @return [Hash]

# File lib/fusuma/config/searcher.rb, line 118
def find_context(request_context, &block)
  # Search in blocks in the following order.
  # 1. complete match config[:context] == request_context
  # 2. partial match config[:context] =~ request_context
  # 3. no context
  Config.instance.keymap.each do |config|
    next unless config[:context] == request_context
    return config[:context] if with_context(config[:context]) { block.call }
  end
  if request_context.keys.size > 1
    Config.instance.keymap.each do |config|
      next if config[:context].nil?

      next unless config[:context].all? { |k, v| request_context[k] == v }
      return config[:context] if with_context(config[:context]) { block.call }
    end
  end
  return {} if with_context({}) { block.call }
end
skip(&block) click to toggle source
# File lib/fusuma/config/searcher.rb, line 156
def skip(&block)
  @skip = true
  result = block.call
  @skip = false
  result
end
skip?() click to toggle source
# File lib/fusuma/config/searcher.rb, line 144
def skip?
  @skip
end
with_condition(condition, &block) click to toggle source

Execute block with specified conditions @param conidtion [Symbol] @return [Object]

# File lib/fusuma/config/searcher.rb, line 90
def with_condition(condition, &block)
  conditions(&block)[condition].call
end
with_context(context, &block) click to toggle source

Search with context from load_streamed Config @param context [Hash] @return [Object]

# File lib/fusuma/config/searcher.rb, line 108
def with_context(context, &block)
  @context = context || {}
  result = block.call
  @context = {}
  result
end

Public Instance Methods

cache(key) { |: nil| ... } click to toggle source
# File lib/fusuma/config/searcher.rb, line 56
def cache(key)
  @cache ||= {}
  key = key.join(',') if key.is_a? Array
  if @cache.key?(key)
    @cache[key]
  else
    @cache[key] = block_given? ? yield : nil
  end
end
search_with_cache(index, location:) click to toggle source

@param index [Index] @param location [Hash] @return [NilClass] @return [Hash] @return [Object]

# File lib/fusuma/config/searcher.rb, line 50
def search_with_cache(index, location:)
  cache([index.cache_key, Searcher.context, Searcher.skip?, Searcher.fallback?]) do
    search_with_context(index, location: location, context: Searcher.context)
  end
end
search_with_context(index, location:, context:) click to toggle source
# File lib/fusuma/config/searcher.rb, line 34
def search_with_context(index, location:, context:)
  return nil if location.nil?

  return search(index, location: location[0]) if context == {}

  new_location = location.find do |conf|
    search(index, location: conf) if conf[:context] == context
  end
  search(index, location: new_location)
end

Private Instance Methods

next_location_cadidates(location, key) click to toggle source

next locations' candidates sorted by priority

1. look up location with key
2. skip the key and go to child location
# File lib/fusuma/config/searcher.rb, line 71
def next_location_cadidates(location, key)
  [
    location[key.symbol],
    Searcher.skip? && key.skippable && location
  ].compact
end