Sha256: af9a2798680f373757bc33a66f703adead4eeaebd6f8b15616829a3fbf0ed703

Contents?: true

Size: 1010 Bytes

Versions: 5

Compression:

Stored size: 1010 Bytes

Contents

require "json"
require "delegate"

module GlassOctopus
  module Middleware
    class JsonParser
      def initialize(app, options={})
        @app = app
        @klass = options.delete(:class)
        @encoding = options.delete(:encoding)
        @options = options
      end

      def call(ctx)
        message = parse(ensure_encoding(ctx.message.value))
        ctx = ContextWithJsonParsedMessage.new(ctx, message)
        @app.call(ctx)
      end

      private

      def parse(str)
        hash = JSON.parse(str, { :create_additions => false }.merge(@options))
        @klass ? @klass.new(hash) : hash
      end

      def ensure_encoding(value)
        return value unless @encoding
        value.encode(@encoding, invalid: :replace, undef: :replace, replace: '')
      end

      class ContextWithJsonParsedMessage < SimpleDelegator
        attr_reader :params

        def initialize(wrapped_ctx, params)
          super(wrapped_ctx)
          @params = params
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
glass_octopus-2.2.0 lib/glass_octopus/middleware/json_parser.rb
glass_octopus-2.1.0 lib/glass_octopus/middleware/json_parser.rb
glass_octopus-2.0.0 lib/glass_octopus/middleware/json_parser.rb
glass_octopus-1.1.0 lib/glass_octopus/middleware/json_parser.rb
glass_octopus-1.0.0 lib/glass_octopus/middleware/json_parser.rb