module Grape::Formatter::FastJsonapi

Public Class Methods

call(object, env) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 7
def call(object, env)
  return object if object.is_a?(String)
  return ::Grape::Json.dump(serialize(object, env)) if serializable?(object)
  return object.to_json if object.respond_to?(:to_json)
  ::Grape::Json.dump(object)
end

Private Class Methods

fast_jsonapi_options(env) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 73
def fast_jsonapi_options(env)
  env['fast_jsonapi_options'] || {}
end
fast_jsonapi_serializable(object, options) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 38
def fast_jsonapi_serializable(object, options)
  serializable_class(object, options)&.new(object, options)
end
heterogeneous_collection?(collection) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 52
def heterogeneous_collection?(collection)
  collection.map { |item| item.class.name }.uniq.size > 1
end
serializable?(object) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 16
def serializable?(object)
  return false if object.nil?

  object.respond_to?(:serializable_hash) || object.respond_to?(:to_a) && object.all? { |o| o.respond_to? :serializable_hash } || object.is_a?(Hash)
end
serializable_class(object, options) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 56
def serializable_class(object, options)
  klass_name = options['serializer'] || options[:serializer]
  klass_name ||= begin
    object = object.first if object.is_a?(Array)

    (object.try(:model_name) || object.class).name + 'Serializer'
  end

  klass_name&.safe_constantize
end
serializable_collection(collection, options) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 42
def serializable_collection(collection, options)
 if heterogeneous_collection?(collection)
    collection.map do |o|
      fast_jsonapi_serializable(o, options).serializable_hash || o.map(&:serializable_hash)
    end
  else
    fast_jsonapi_serializable(collection, options)&.serializable_hash || collection.map(&:serializable_hash)
  end
end
serializable_object(object, options) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 34
def serializable_object(object, options)
  fast_jsonapi_serializable(object, options) || object
end
serialize(object, env) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 22
def serialize(object, env)
  if object.respond_to? :serializable_hash
    serializable_object(object, fast_jsonapi_options(env)).serializable_hash
  elsif object.respond_to?(:to_a) && object.all? { |o| o.respond_to? :serializable_hash }
    serializable_collection(object, fast_jsonapi_options(env))
  elsif object.is_a?(Hash)
    serialize_each_pair(object, env)
  else
    object
  end
end
serialize_each_pair(object, env) click to toggle source
# File lib/grape_fast_jsonapi/formatter.rb, line 67
def serialize_each_pair(object, env)
  h = {}
  object.each_pair { |k, v| h[k] = serialize(v, env) }
  h
end