Sha256: f0a9b63481e18a7479589fcc1633c1de89e5a8b69fd39f35e058eae144233017

Contents?: true

Size: 1.6 KB

Versions: 10

Compression:

Stored size: 1.6 KB

Contents

module Sneakers
  class ContentType
    def self.register(content_type: nil, serializer: nil, deserializer: nil)
      # This can be removed when support is dropped for ruby 2.0 and replaced
      # by a keyword arg with no default value
      fail ArgumentError, 'missing keyword: content_type' if content_type.nil?
      fail ArgumentError, 'missing keyword: serializer' if serializer.nil?
      fail ArgumentError, 'missing keyword: deserializer' if deserializer.nil?

      fail ArgumentError, "#{content_type} serializer must be a proc" unless serializer.is_a? Proc
      fail ArgumentError, "#{content_type} deserializer must be a proc" unless deserializer.is_a? Proc

      fail ArgumentError, "#{content_type} serializer must accept one argument, the payload" unless serializer.arity == 1
      fail ArgumentError, "#{content_type} deserializer must accept one argument, the payload" unless deserializer.arity == 1
      @_types[content_type] = new(serializer, deserializer)
    end

    def self.serialize(payload, content_type)
      return payload unless content_type
      @_types[content_type].serializer.(payload)
    end

    def self.deserialize(payload, content_type)
      return payload unless content_type
      @_types[content_type].deserializer.(payload)
    end

    def self.reset!
      @_types = Hash.new(
        new(passthrough, passthrough)
      )
    end

    def self.passthrough
      ->(payload) { payload }
    end

    def initialize(serializer, deserializer)
      @serializer = serializer
      @deserializer = deserializer
    end

    attr_reader :serializer, :deserializer

    reset!
  end
end

Version data entries

10 entries across 10 versions & 2 rubygems

Version Path
kicks-3.2.0 lib/sneakers/content_type.rb
kicks-3.1.1 lib/sneakers/content_type.rb
kicks-3.1.0 lib/sneakers/content_type.rb
kicks-3.0.0 lib/sneakers/content_type.rb
kicks-3.0.0.pre lib/sneakers/content_type.rb
sneakers-2.12.0 lib/sneakers/content_type.rb
sneakers-2.12.0.rc1 lib/sneakers/content_type.rb
sneakers-2.11.0 lib/sneakers/content_type.rb
sneakers-2.7.0 lib/sneakers/content_type.rb
sneakers-2.6.0 lib/sneakers/content_type.rb