module Fulfil::ResponseParser
Public Class Methods
group(key_value_tuples)
click to toggle source
# File lib/fulfil/response_parser.rb, line 41 def self.group(key_value_tuples) key_value_tuples .group_by { |kv_tuple| kv_tuple[0][0] } .map { |group_key, kv_tuples| if kv_tuples.length == 1 [group_key, mapped_value_field(value: kv_tuples[0][1])] else id = kv_tuples[0] attrs = kv_tuples[1..-1].map { |tuple| [tuple[0][1..-1], tuple[1]] } [group_key, [['id', id[1]]].concat(group(attrs)).to_h] end } end
mapped_value_field(value:)
click to toggle source
Handle value objects, for example:
“order_date”: {
"__class__": "date", "iso_string": "2019-07-08"
}
# File lib/fulfil/response_parser.rb, line 19 def self.mapped_value_field(value:) return value unless value.is_a?(Hash) && value.dig('__class__') json_class = value.dig('__class__') case json_class when 'date' date = value.dig('iso_string') Date.parse(date) when 'datetime' time = value.dig('iso_string') DateTime.parse(time) when 'Decimal', 'timedelta' value.dig('decimal').to_f else raise UnhandledTypeError.new( "received a value that we don't know how to handle: #{json_class}", json_class ) end end
parse(item:)
click to toggle source
# File lib/fulfil/response_parser.rb, line 55 def self.parse(item:) key_value_tuples = item.to_a.map { |item_tuple| [item_tuple[0].split('.'), item_tuple[1]] } group(key_value_tuples).to_h end