Module: Core::Io::Base::JsonFormattingBehaviour::Output

Defined in:
app/api/core/io/base/json_formatting_behaviour/output.rb

Instance Method Summary collapse

Instance Method Details

#generate_object_to_json_mapping(attribute_to_json) ⇒ Object


7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'app/api/core/io/base/json_formatting_behaviour/output.rb', line 7

def generate_object_to_json_mapping(attribute_to_json)
  # Sort the attribute_to_json map such that the JSON elements are in order, thus ensuring that
  # we will only open and close blocks as we go.  Then build a tree that can be executed against
  # an object to generate the JSON appropriately.
  tree = attribute_to_json.sort_by(&:last).map do |attribute, json|
    [json.split('.'), attribute.split('.').map(&:to_sym)]
  end.inject(json_code_tree.for(self)) do |tree, (json_path, attribute_path)|
    tree.tap do
      json_leaf = json_path.pop
      json_path.inject(tree) { |node, step| node[step] }.leaf(json_leaf, attribute_path)
    end
  end

  # Now we can generate a method that will use that tree to encode an object to JSON.
  singleton_class.send(:define_method, :json_code_tree) { tree }
  singleton_class.send(:define_method, :object_json, &tree.method(:encode))
end