module BBLib::Serializer

Public Class Methods

included(base) click to toggle source
# File lib/bblib/core/mixins/serializer.rb, line 6
def self.included(base)
  base.extend ClassMethods
end

Public Instance Methods

serialize(ignore_defaults = false) click to toggle source
# File lib/bblib/core/mixins/serializer.rb, line 47
def serialize(ignore_defaults = false)
  self.class._serialize_fields.map do |name, opts|
    next if self.class._dont_serialize_fields.include?(name)
    args = [opts[:method]] + (opts.include?(:args) ? [opts[:args]].flatten(1) : [])
    value = send(*args)
    next if value == self
    unless opts[:flat]
      if value.is_a?(Hash)
        value = value.map { |k, v| [k, v != self && v.respond_to?(:serialize) ? v.serialize(ignore_defaults) : v] }.to_h
      elsif value.is_a?(Array)
        value = value.map { |v| v != self && v.respond_to?(:serialize) ? v.serialize(ignore_defaults) : v }
      elsif value.respond_to?(:serialize)
        value = value.serialize(ignore_defaults)
      end
    end
    if !opts[:always] && (ignore_defaults && value == opts[:default] || opts.include?(:ignore) && value == opts[:ignore])
      nil
    else
      [name, value]
    end
  end.compact.to_h
end