Sha256: e9d045d4e2968c8226bc4e8968f6317ba360d25c99c9b43bdebf5688a73f3f5b

Contents?: true

Size: 1.77 KB

Versions: 4

Compression:

Stored size: 1.77 KB

Contents

# -*- coding: utf-8 -*-

module Yaks
  class JsonApiSerializer < Serializer
    def serialize
      serialized = Yaks::Hash(
        pluralize(profile_name.to_s) => resource.map(&method(:serialize_resource))
      )

      if options[:embed] == :resources
        linked = resource.reduce(Yaks::Hash()) do |memo, res|
          serialize_linked_subresources(res.subresources, memo)
        end
        serialized = serialized.put('linked', linked)
      end

      Primitivize.( serialized )
    end
    alias to_json_api serialize

    def serialize_resource(resource)
      result = resource.attributes
      result = result.merge(Yaks::Hash(:links => serialize_links(resource.subresources))) unless resource.subresources.empty?
      result
    end

    def serialize_links(subresources)
      Yaks::Hash(subresources.map &method(:serialize_link))
    end

    def serialize_link(name, resource)
      if options[:embed] == :links
        [ name, resource.uri ]
      else
        [ name, resource.collection? ? resource.map(&curry_symbol(:[], :id)) : resource[:id] ]
      end
    end

    def serialize_linked_subresources(subresources, linked)
      subresources.reduce(linked) do |memo, name, resources|
        serialize_linked_resources(resources, memo)
      end
    end

    def serialize_linked_resources(resources, linked)
      resources.reduce(linked) do |memo, resource|
        serialize_subresource(resource, memo)
      end
    end

    # {shows => [{id: 3, name: 'foo'}]}
    def serialize_subresource(resource, linked)
      key = pluralize(profile_registry.find_by_uri(resource.profile).to_s)
      set = linked.fetch(key) { Hamster.set }
      linked = linked.put(key, set << serialize_resource(resource))
      serialize_linked_subresources(resource.subresources, linked)
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
yaks-0.3.1 lib/yaks/json_api_serializer.rb
yaks-0.3.0 lib/yaks/json_api_serializer.rb
yaks-0.2.0 lib/yaks/json_api_serializer.rb
yaks-0.1.0 lib/yaks/json_api_serializer.rb