Sha256: c1d4dcedf1c8a09a847f96d179398d910a71c6f82052f21c9078ce50cb125caa

Contents?: true

Size: 1.18 KB

Versions: 4

Compression:

Stored size: 1.18 KB

Contents

require 'erb'

module Airrecord
  # Airtable expects that arrays in query strings be encoded with indices.
  # Faraday follows Rack conventions and encodes arrays _without_ indices.
  #
  # Airrecord::QueryString is a Faraday-compliant params_encoder that follows
  # the Airtable spec.
  module QueryString
    def self.encode(params)
      params.map { |key, val| Encodings[val].call(key, val) }.join('&')
    end

    def self.decode(query)
      Faraday::NestedParamsEncoder.decode(query)
    end

    def self.escape(*query)
      query.map { |qs| ERB::Util.url_encode(qs) }.join('')
    end

    module Encodings
      def self.[](value)
        TYPES.fetch(value.class, DEFAULT)
      end

      TYPES = {
        Array => lambda do |prefix, array|
          array.each_with_index.map do |value, index|
            self[value].call("#{prefix}[#{index}]", value)
          end
        end,
        Hash => lambda do |prefix, hash|
          hash.map do |key, value|
            self[value].call("#{prefix}[#{key}]", value)
          end
        end
      }.freeze

      DEFAULT = lambda do |key, value|
        "#{QueryString.escape(key)}=#{QueryString.escape(value)}"
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
airrecord-1.0.10 lib/airrecord/query_string.rb
airrecord-1.0.9 lib/airrecord/query_string.rb
airrecord-1.0.8 lib/airrecord/query_string.rb
airrecord-1.0.7 lib/airrecord/query_string.rb