module Recurly::Schema::RequestCaster
Note: This module is for internal use. The RequestCaster
turns mixed data into a pure Hash so it can be serialized into JSON and used as the body of a request. This module is to be extended by the Request
class.
Public Instance Methods
cast_request(data, schema = self.schema)
click to toggle source
This method casts the data object (of mixed types) into a Hash ready for JSON serialization. The schema will default to the self's schema. You should pass in the schema where possible. This is because objects are serialized differently depending on the context in which they are being written.
@example
Recurly::Requests::AccountUpdatable.cast(code: 'benjamin') #=> {:code=>"benjamin"}
@example
# If you have some mixed data, like passing in an Address, it should cast that # address into a Hash based on the Schema defined in AccountUpdatable address = Recurly::Resources::Address.new(city: 'New Orleans') Recurly::Requests::AccountUpdatable.cast(account_code: 'benjamin', address: address) #=> {:account_code=>"benjamin", :address=>{:city=>"New Orleans"}}
@param data [Hash,Resource,Request] The data to transform into a JSON Hash. @param schema [Schema] The schema to use to transform the data into a JSON Hash. @return [Hash] The pure Hash ready to be serialized into JSON.
# File lib/recurly/schema/request_caster.rb, line 29 def cast_request(data, schema = self.schema) casted = {} if data.is_a?(Resource) || data.is_a?(Request) data = data.attributes.reject { |_k, v| v.nil? } end data.each do |k, v| schema_attr = schema.get_attribute(k) norm_val = if v.respond_to?(:attributes) cast_request(v, v.class.schema) elsif v.is_a?(Array) v.map do |elem| if elem.respond_to?(:attributes) cast_request(elem, elem.class.schema) else elem end end elsif v.is_a?(Hash) && schema_attr && schema_attr.is_a?(Schema::ResourceAttribute) cast_request(v, schema_attr.recurly_class.schema) else v end casted[k] = norm_val end casted end