Class: Trevl::Renderer::RefParser
- Inherits:
-
Object
- Object
- Trevl::Renderer::RefParser
- 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
- #dig(obj, keys) ⇒ Object
- #extract_references(obj) ⇒ Object
- #parse(ref_without_dollar) ⇒ Object
- #ref_key(parsed) ⇒ Object
- #ref_key_for(ref_without_dollar) ⇒ Object
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 |