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(manifest) ⇒ Resolver

Returns a new instance of Resolver.



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

def initialize(manifest)
  @manifest = manifest
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 = @manifest.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)
  @manifest.validate_key!(key)
  segments = key.split(".")
  candidates = @manifest.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(@manifest.entries.reject { |e| nested_entry?(e) }.map(&:key))
  candidates.uniq!
  Key::Distance.suggest(key, candidates, limit: 5)
rescue StandardError
  []
end