Sha256: fc6a1d09cc62dfc18b8f54b53d25e0688fa42b5faf476adba26433bd5929037c

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

class ActiveSerializer::Serializers::HashSerializer
  attr_reader :serialized_data

  def initialize(root_hash, options = {})
    @root_hash       = root_hash
    @options         = options
    @serialized_data = {}
  end

  def attribute(name, value = nil, &block)
    if block_given?
      value = yield
    elsif !value
      value = @root_hash[name]
    end
    set_value(name, value)
  end

  def attributes(*serialized_data, &block)
    if !serialized_data.last.is_a?(Symbol)
      source_hash = serialized_data.delete_at(-1)
    else
      source_hash = @root_hash
    end

    serialized_data.each do |attr_name|
      set_value(attr_name, source_hash[attr_name])
    end
  end

  def namespace(name, &block)
    serializer = self.class.new(@root_hash, @options)
    serializer.instance_exec(@root_hash, &block)
    set_value(name, serializer.serialized_data)
  end

  def resource(name, source_hash = nil, &block)
    source_hash ||= @root_hash[name]
    set_value(name, serialize_resource(source_hash, &block))
  end

  def resources(name, source_hashes = nil, &block)
    source_hashes ||= @root_hash[name]

    self.serialized_data[name] = (source_hashes || []).inject([]) do |result, source_hash|
      data = serialize_resource(source_hash, &block)
      data.empty? ? result : (result << data)
    end
  end

  protected

  def serialize_resource(source_hash, &block)
    return nil unless source_hash
    serializer = self.class.new(source_hash, @options)
    serializer.instance_exec(source_hash, &block)
    serializer.serialized_data
  end

  def set_value(name, value)
    self.serialized_data[name] = value
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
active_serializer-0.1.0 lib/active_serializer/serializers/hash_serializer.rb