class SimpleJsonapi::SerializerInferrer
Identifies the serializer class that should be used for a resource or error object.
Attributes
@!attribute [r] namespace
@return [String]
Public Class Methods
@param explicit_mappings [Hash{Class => Class}] A mapping of resource classes to serializer classes @param namespace [String] A namespace in which to search for serializer classes @yieldparam object [Object] The resource or error @yieldreturn [Class] A serializer class
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 38 def initialize(explicit_mappings: nil, namespace: nil, &block) @explicit_mappings = {} @explicit_mappings.merge!(explicit_mappings) if explicit_mappings @namespace = namespace @infer_proc = block end
@param serializer [SerializerInferrer,Serializer,ErrorSerializer,nil] @return [SerializerInferrer]
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 23 def self.wrap(serializer) if serializer.is_a?(SerializerInferrer) serializer elsif serializer.present? klass = serializer_class(serializer) SerializerInferrer.new { |_resource| klass } else SimpleJsonapi.serializer_inferrer end end
Private Class Methods
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 125 def self.serializer_class(serializer) case serializer when Class serializer else serializer.to_s.constantize end end
Public Instance Methods
@param resource_class [Class] @param serializer_class
[Class] @return [void]
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 60 def add(resource_class, serializer_class) @explicit_mappings[resource_class.name] = serializer_class end
@return [Class,nil]
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 74 def default_serializer unless defined?(@default_serializer) begin @default_serializer = infer(nil) rescue SerializerInferenceError @default_serializer = nil end end @default_serializer end
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 85 def default_serializer? default_serializer != nil end
@param resource [Object] @return [Class] A serializer class @raise [SerializerInferenceError] if a serializer isn't found
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 67 def infer(resource) serializer = (@infer_proc || default_infer_proc).call(resource) raise SerializerInferenceError.new(resource) unless serializer serializer end
@param explicit_mappings [Hash{Class => Class}] @return [self]
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 50 def merge(explicit_mappings) explicit_mappings.each do |resource_class, serializer_class| add(resource_class, serializer_class) end self end
Private Instance Methods
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 91 def default_infer_proc @default_infer_proc ||= proc do |resource| serializer = nil resource.class.ancestors.find do |ancestor| serializer = find_serializer_by_name(ancestor.name) end serializer end end
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 103 def find_serializer_by_name(name) if @explicit_mappings.key?(name) @explicit_mappings[name] else serializer_name_for_class_name(name).safe_constantize end end
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 115 def prefix(resource_class_name) if namespace.blank? "" elsif resource_class_name.starts_with?("#{namespace}::") "" else "#{namespace}::" end end
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 111 def serializer_name_for_class_name(resource_class_name) "#{prefix(resource_class_name)}#{resource_class_name}Serializer" end