Sha256: fc39c65ac85c1a43b59236be2362ebc42f310497de2318e68f9114e228d2240c

Contents?: true

Size: 1.61 KB

Versions: 2

Compression:

Stored size: 1.61 KB

Contents

require "date"

module Recurly
  class Schema
    # 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.
    module ResourceCaster

      # 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.
      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
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
recurly-3.2.1 lib/recurly/schema/resource_caster.rb
recurly-3.2.0 lib/recurly/schema/resource_caster.rb