module Recurly::Schema::ResourceCaster

The purpose of this class is to turn JSON parsed Hashes defined into Recurly ruby objects. It’s to be used by the Resource as an extension.

Public Instance Methods

cast(attributes = {}) click to toggle source

Gives the class the ability to initialize itself given some json data.

@example

Recurly::Resources::Account.cast({"code" => "mycode"})
#=> #<Recurly::Resources::Account @attributes={:code=>"mycode"}>

@param attributes [Hash] A primitive Hash from JSON.parse of Recurly response. @return [Resource] the {Resource} (ruby object) representing the passed in JSON data.

# File lib/recurly/schema/resource_caster.rb, line 19
def cast(attributes = {})
  resource = new()
  attributes.each do |attr_name, val|
    schema_attr = self.schema.get_attribute(attr_name)

    if schema_attr
      val = if val.nil?
          val
        elsif schema_attr.is_valid?(val)
          schema_attr.cast(val)
        else
          if Recurly::STRICT_MODE
            msg = "#{self.class}##{attr_name} does not have the right type. Value: #{val.inspect} was expected to be a #{schema_attr}"
            raise ArgumentError, msg
          end
        end

      writer = "#{attr_name}="
      resource.send(writer, val)
    elsif Recurly::STRICT_MODE
      raise ArgumentError, "#{resource.class.name} encountered json attribute #{attr_name.inspect}: #{val.inspect} but it's unknown to it's schema"
    end
  end
  resource
end