class FastSerializer::SerializedField

Data structure used internally for maintaining a field to be serialized.

Attributes

condition[R]
name[R]

Public Class Methods

new(name, optional: false, serializer: nil, serializer_options: nil, enumerable: false, condition: nil) click to toggle source
# File lib/fast_serializer/serialized_field.rb, line 8
def initialize(name, optional: false, serializer: nil, serializer_options: nil, enumerable: false, condition: nil)
  @name = name
  @optional = !!optional
  @condition = condition
  if serializer
    @serializer = serializer
    @serializer_options = serializer_options
    @enumerable = enumerable
  end
end

Public Instance Methods

optional?() click to toggle source
# File lib/fast_serializer/serialized_field.rb, line 19
def optional?
  @optional
end
serialize(value, options = nil) click to toggle source

Wrap a value in the serializer if one has been set. Otherwise just returns the raw value.

# File lib/fast_serializer/serialized_field.rb, line 24
def serialize(value, options = nil)
  if value && @serializer
    serializer = nil
    if @enumerable
      serializer = ArraySerializer.new(value, :serializer => @serializer, :serializer_options => serializer_options(options))
    else
      serializer = @serializer.new(value, serializer_options(options))
    end
    context = SerializationContext.current
    if context
      context.with_reference(value){ serializer.as_json }
    else
      serializer.as_json
    end
  else
    serialize_value(value)
  end
end

Private Instance Methods

deep_merge(hash, merge_hash) click to toggle source
# File lib/fast_serializer/serialized_field.rb, line 57
def deep_merge(hash, merge_hash)
  retval = {}
  merge_hash.each do |key, merge_value|
    value = hash[key]
    if value.is_a?(Hash) && merge_value.is_a?(Hash)
      retval[key] = deep_merge(value, merge_value)
    else
      retval[key] = merge_value
    end
  end
  retval
end
serialize_enumerable(value) click to toggle source
# File lib/fast_serializer/serialized_field.rb, line 107
def serialize_enumerable(value)
  array = nil
  value.each_with_index do |v, i|
    val = serialize_value(v)
    if val.object_id != v.object_id
      array = value.dup unless array
      array[i] = val
    end
  end
  array || value
end
serialize_hash(value) click to toggle source
# File lib/fast_serializer/serialized_field.rb, line 95
def serialize_hash(value)
  hash = nil
  value.each do |k, v|
    val = serialize_value(v)
    if val.object_id != v.object_id
      hash = value.dup unless hash
      hash[k] = val
    end
  end
  hash || value
end
serialize_value(value) click to toggle source

Convert the value to primitive data types: string, number, boolean, symbol, time, date, array, hash.

# File lib/fast_serializer/serialized_field.rb, line 71
def serialize_value(value)
  if value.is_a?(String) || value.is_a?(Numeric) || value == nil || value == true || value == false || value.is_a?(Symbol)
    value
  elsif value.is_a?(Time) || value.is_a?(Date)
    if defined?(ActiveSupport::TimeWithZone) && value.is_a?(ActiveSupport::TimeWithZone)
      value.to_time
    else
      value
    end
  elsif value.is_a?(Hash)
    serialize_hash(value)
  elsif value.is_a?(Enumerable)
    serialize_enumerable(value)
  elsif value.respond_to?(:as_json)
    value.as_json
  elsif value.respond_to?(:to_hash)
    value.to_hash
  elsif value.respond_to?(:to_h)
    value.to_h
  else
    value
  end
end
serializer_options(options) click to toggle source
# File lib/fast_serializer/serialized_field.rb, line 45
def serializer_options(options)
  if options
    if @serializer_options
      deep_merge(@serializer_options, options)
    else
      options
    end
  else
    @serializer_options
  end
end