lib/whos_got_dirt/renderer.rb
module WhosGotDirt
# Accepts a JSON template, which is a hash in which some values are
# [JSON Pointers](http://tools.ietf.org/html/rfc6901). The template is
# rendered by evaluating its JSON Pointers against JSON data.
#
# @example
# renderer = WhosGotDirt::Renderer.new('name' => '/fn')
# data = {'fn' => 'John Smith'}
# renderer.result(data)
# #=> {'name' => 'John Smith'}
#
# @see http://ruby-doc.org/stdlib-2.2.3/libdoc/erb/rdoc/ERB.html
class Renderer
# @!attribute [r] template
# @return [Hash] the template
attr_reader :template
# Sets the template.
#
# @param [Object] template a template
def initialize(template)
@template = template
end
# Renders the template by evaluating its JSON Pointers against JSON data.
#
# @param [Object] data the JSON data
# @return [Object] the rendered template
def result(data)
walk(template, data)
end
private
# @see https://github.com/pudo/jsonmapping/blob/master/jsonmapping/mapper.py
def walk(node, data)
case node
when Hash
hash = {}
node.each do |key,value|
if value.respond_to?(:call)
k, v = value.call(data)
else
v = walk(value, data)
end
if v
hash[k || key] = v
end
end
hash
when Array
node.map do |child|
walk(child, data)
end
when String
if node.start_with?('/')
JsonPointer.new(data, node).value
else
node
end
else
node
end
end
end
end