Class: Textus::Protocol::Manifest::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/textus/protocol/manifest/resolver.rb

Defined Under Namespace

Classes: Resolution

Constant Summary collapse

MAX_DISTANCE_LEN =
200

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ Resolver

Returns a new instance of Resolver.



9
10
11
# File 'lib/textus/protocol/manifest/resolver.rb', line 9

def initialize(data)
  @data = data
end

Instance Method Details

#enumerate(prefix: nil, include_keyless: false) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/textus/protocol/manifest/resolver.rb', line 31

def enumerate(prefix: nil, include_keyless: false)
  out = @data.entries.flat_map do |entry|
    nested_entry?(entry) ? enumerate_nested(entry, include_keyless: include_keyless) : enumerate_leaf(entry)
  end
  out.select! { |row| row[:key] == prefix || row[:key].start_with?("#{prefix}.") } if prefix
  out.sort_by { |row| row[:key] }
end

#resolve(key) ⇒ Object

Raises:



13
14
15
16
17
18
19
20
# File 'lib/textus/protocol/manifest/resolver.rb', line 13

def resolve(key)
  @data.validate_key!(key)
  dr = Protocol::Key.resolve(key, @data.entries)
  raise UnknownKey.new(key, suggestions: suggestions_for(key)) unless dr
  raise UnknownKey.new(key, suggestions: suggestions_for(key)) unless dr.entry

  Resolution.new(entry: dr.entry, path: build_path(dr.entry, dr.remaining), remaining: dr.remaining)
end

#suggestions_for(key) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/textus/protocol/manifest/resolver.rb', line 22

def suggestions_for(key)
  candidates = enumerate.map { |r| r[:key] }
  candidates.concat(@data.entries.reject { |e| nested_entry?(e) }.map(&:key))
  candidates.uniq!
  suggest(key, candidates, limit: 5)
rescue StandardError
  []
end