Sha256: 81699885473543d94407851b570d7643e3093e210a6a13667f55ad423333d5d9
Contents?: true
Size: 1.94 KB
Versions: 1
Compression:
Stored size: 1.94 KB
Contents
module Alba # This module represents how a resource should be serialized. module Serializer # @!parse include InstanceMethods # @!parse extend ClassMethods # @private def self.included(base) super base.class_eval do @_opts = {} unless instance_variable_defined?('@_opts') @_metadata = {} unless instance_variable_defined?('@_metadata') end base.include InstanceMethods base.extend ClassMethods end # Instance methods module InstanceMethods # @param resource [Alba::Resource] def initialize(resource) @resource = resource @hash = resource.serializable_hash @hash = {key.to_sym => @hash} if key # @hash is either Hash or Array unless metadata.empty? @hash.is_a?(Hash) ? @hash.merge!(metadata.to_h) : @hash << metadata end end # Use real encoder to actually serialize to JSON # # @return [String] JSON string def serialize Alba.encoder.call(@hash) end private def key opts = self.class._opts opts[:key] == true ? @resource.key : opts[:key] end def metadata metadata = self.class._metadata metadata.transform_values { |block| block.call(@resource.object) } end end # Class methods module ClassMethods attr_reader :_opts, :_metadata # @private def inherited(subclass) super %w[_opts _metadata].each { |name| subclass.instance_variable_set("@#{name}", public_send(name).clone) } end # Set options, currently key only # # @param key [Boolean, Symbol] def set(key: false) @_opts[:key] = key end # Set metadata # # @param name [String, Symbol] key for the metadata # @param block [Block] the content of the metadata def metadata(name, &block) @_metadata[name.to_sym] = block end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
alba-0.12.0 | lib/alba/serializer.rb |