Class: Textus::Manifest::Resolver

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

Defined Under Namespace

Classes: Resolution

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ Resolver

Returns a new instance of Resolver.



6
7
8
# File 'lib/textus/manifest/resolver.rb', line 6

def initialize(data)
  @data = data
end

Instance Method Details

#enumerate(prefix: nil) ⇒ Object



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

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

#resolve(key) ⇒ Object

Raises:



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/textus/manifest/resolver.rb', line 10

def resolve(key)
  @data.validate_key!(key)
  segments = key.split(".")
  candidates = @data.entries
                    .map { |e| [e, e.key.split(".")] }
                    .select { |(_, esegs)| esegs == segments[0, esegs.length] }
                    .sort_by { |(_, esegs)| -esegs.length }
  raise UnknownKey.new(key, suggestions: suggestions_for(key)) if candidates.empty?

  entry, esegs = candidates.first
  remaining = segments[esegs.length..]
  build_resolution(entry, remaining, key)
end

#suggestions_for(key) ⇒ Object



24
25
26
27
28
29
30
31
# File 'lib/textus/manifest/resolver.rb', line 24

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