Sha256: 83f258aeaa9b8df7af1bcc1cd2633998226bdf6e3f03db86a9adbfc84d750d99

Contents?: true

Size: 1.9 KB

Versions: 9

Compression:

Stored size: 1.9 KB

Contents

require 'rest-core/middleware'

class RestCore::JsonDecode
  def self.members; [:json_decode]; end
  include RestCore::Middleware

  def call env
    return app.call(env) if env[DRY]
    response = app.call(env)
    if json_decode(env)
      response.merge(RESPONSE_BODY =>
        self.class.json_decode("[#{response[RESPONSE_BODY]}]").first)
        # [this].first is not needed for yajl-ruby
    else
      response
    end
  rescue self.class.const_get(:ParseError) => error
    fail(response, error)
  end

  module YajlRuby
    def self.extended mod
      mod.const_set(:ParseError, Yajl::ParseError)
    end
    def json_encode hash
      Yajl::Encoder.encode(hash)
    end
    def json_decode json
      Yajl::Parser.parse(json)
    end
  end

  module Json
    def self.extended mod
      mod.const_set(:ParseError, JSON::ParserError)
    end
    def json_encode hash
      JSON.dump(hash)
    end
    def json_decode json
      JSON.parse(json)
    end
  end

  module Gsub
    class ParseError < RuntimeError; end
    def self.extended mod
      mod.const_set(:ParseError, Gsub::ParseError)
    end
    # only works for flat hash
    def json_encode hash
      middle = hash.inject([]){ |r, (k, v)|
                 r << "\"#{k}\":\"#{v.gsub('"','\\"')}\""
               }.join(',')
      "{#{middle}}"
    end
    def json_decode json
      raise NotImplementedError.new(
        'You need to install either yajl-ruby, json, or json_pure gem')
    end
  end

  def self.select_json! mod, picked=false
    if    Object.const_defined?(:Yajl)
      mod.send(:extend, YajlRuby)
    elsif Object.const_defined?(:JSON)
      mod.send(:extend, Json)
    elsif picked
      mod.send(:extend, Gsub)
    else
      # pick a json gem if available
      %w[yajl json].each{ |json|
        begin
          require json
          break
        rescue LoadError
        end
      }
      select_json!(mod, true)
    end
  end
  select_json!(self)
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
rest-core-0.8.2 lib/rest-core/middleware/json_decode.rb
rest-core-0.8.1 lib/rest-core/middleware/json_decode.rb
rest-core-0.8.0 lib/rest-core/middleware/json_decode.rb
rest-core-0.7.2 lib/rest-core/middleware/json_decode.rb
rest-core-0.7.0 lib/rest-core/middleware/json_decode.rb
rest-core-0.4.0 lib/rest-core/middleware/json_decode.rb
rest-core-0.4.0.pre.2 lib/rest-core/middleware/json_decode.rb
rest-core-0.4.0.pre.1 lib/rest-core/middleware/json_decode.rb
rest-core-0.4.0.pre.0 lib/rest-core/middleware/json_decode.rb