Class: Trevl::Renderer::RefParser

Inherits:
Object
  • Object
show all
Defined in:
lib/trevl/renderer/ref_parser.rb

Overview

Parses $-prefixed variable references in TREVL YAML.

parser = RefParser.new
parser.parse("salary.data.q50")
# => {resource: nil, endpoint: "salary", scope: :data, keys: ["q50"]}

Instance Method Summary collapse

Instance Method Details

#dig(obj, keys) ⇒ Object



51
52
53
54
55
56
57
58
# File 'lib/trevl/renderer/ref_parser.rb', line 51

def dig(obj, keys)
  return obj if keys.nil? || keys.empty?
  keys.reduce(obj) do |acc, key|
    return nil if acc.nil?
    next nil unless acc.is_a?(Hash)
    acc[key.to_s] || acc[key.to_sym]
  end
end

#extract_references(obj) ⇒ Object



41
42
43
44
45
46
47
48
49
# File 'lib/trevl/renderer/ref_parser.rb', line 41

def extract_references(obj)
  refs = []
  case obj
  when Hash then obj.each_value { |v| refs.concat(extract_references(v)) }
  when Array then obj.each { |v| refs.concat(extract_references(v)) }
  when String then refs << obj.delete_prefix("$") if obj.start_with?("$")
  end
  refs.uniq
end

#parse(ref_without_dollar) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/trevl/renderer/ref_parser.rb', line 12

def parse(ref_without_dollar)
  parts = ref_without_dollar.to_s.split(".")
  resource = nil

  if parts.length >= 4 && %w[data meta].include?(parts[2])
    resource = parts.shift
  end

  endpoint = parts[0].to_s
  return {resource: resource, endpoint: endpoint, scope: :data, keys: [], legacy: true} if parts.length < 2

  case parts[1]
  when "data"
    {resource: resource, endpoint: endpoint, scope: :data, keys: parts[2..] || [], legacy: false}
  when "meta"
    {resource: resource, endpoint: endpoint, scope: :meta, keys: parts[2..] || [], legacy: false}
  else
    {resource: resource, endpoint: endpoint, scope: :data, keys: [parts.last], legacy: true}
  end
end

#ref_key(parsed) ⇒ Object



33
34
35
# File 'lib/trevl/renderer/ref_parser.rb', line 33

def ref_key(parsed)
  [parsed[:resource], parsed[:endpoint]].compact.join("/")
end

#ref_key_for(ref_without_dollar) ⇒ Object



37
38
39
# File 'lib/trevl/renderer/ref_parser.rb', line 37

def ref_key_for(ref_without_dollar)
  ref_key(parse(ref_without_dollar))
end