Sha256: 35ca3798fb7a9caac6fa5019c0c227667fbd356ba9f1df2d642032637c9f25f5

Contents?: true

Size: 1.65 KB

Versions: 6

Compression:

Stored size: 1.65 KB

Contents

require 'json'
require 'oj'

module TwitterFriendly
  class Serializer
    class << self
      def encode(obj, options = {})
        Instrumenter.perform_encode(options) do
          (!!obj == obj) ? obj : coder.encode(obj)
        end
      end

      def decode(str, options = {})
        Instrumenter.perform_decode(options) do
          str.kind_of?(String) ? coder.decode(str) : str
        end
      end

      def coder
        @@coder ||= Coder.instance
      end

      def coder=(coder)
        @@coder = Coder.instance(coder)
      end
    end

    private

    module Instrumenter

      module_function

      def perform_encode(options, &block)
        payload = {operation: 'encode', args: options[:args]}
        ::ActiveSupport::Notifications.instrument('encode.twitter_friendly', payload) { yield(payload) }
      end

      def perform_decode(options, &block)
        payload = {operation: 'decode', args: options[:args]}
        ::ActiveSupport::Notifications.instrument('decode.twitter_friendly', payload) { yield(payload) }
      end
    end

    class Coder
      def initialize(coder)
        @coder = coder
      end

      def encode(obj)
        @coder.dump(obj)
      end

      def self.instance(coder = nil)
        if coder.nil? && defined?(Oj)
          OjCoder.new(Oj)
        else
          JsonCoder.new(coder)
        end
      end
    end

    class JsonCoder < Coder
      def decode(str)
        @coder.parse(str, symbolize_names: true)
      end
    end

    class OjCoder < Coder
      def encode(obj)
        @coder.dump(obj, mode: :compat)
      end

      def decode(str)
        @coder.load(str, symbol_keys: true)
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
twitter_friendly-1.2.0 lib/twitter_friendly/serializer.rb
twitter_friendly-1.1.0 lib/twitter_friendly/serializer.rb
twitter_friendly-1.0.0 lib/twitter_friendly/serializer.rb
twitter_friendly-0.3.0 lib/twitter_friendly/serializer.rb
twitter_friendly-0.2.1 lib/twitter_friendly/serializer.rb
twitter_friendly-0.2.0 lib/twitter_friendly/serializer.rb