Sha256: cee37f7c709c92cde7b47a7bb647a16c670881688eefaede715936d8aa6c5370

Contents?: true

Size: 1.77 KB

Versions: 2

Compression:

Stored size: 1.77 KB

Contents

require 'multi_json'

module TomogramRouting
  class Tomogram < Array
    def self.craft(docs)
      new(MultiJson.load(docs).inject([]) do |res, doc|
        res.push(Request.new.merge(doc))
      end)
    end

    def find_request(method:, path:)
      find do |doc|
        path = find_request_path(method: method, path: path)
        doc['path'] == path && doc['method'] == method
      end
    end

    private

    def find_request_path(method:, path:)
      return '' unless path && path.size.positive?

      path = remove_the_slash_at_the_end2(path)

      action = search_for_an_exact_match(method, path, self)
      return action['path'] if action

      action = search_with_parameter(method, path, self)
      return action['path'] if action&.first

      ''
    end

    def remove_the_slash_at_the_end2(path)
      return path[0..-2] if path[-1] == '/'
      path
    end

    def search_for_an_exact_match(method, path, documentation)
      documentation.find do |action|
        action['path'] == path && action['method'] == method
      end
    end

    def search_with_parameter(method, path, documentation)
      documentation = actions_with_same_method(documentation, method)
      sought_for_path = path.split('/')

      documentation.map do |action|
        current_path = action['path'].split('/')
        next unless sought_for_path.size == current_path.size
        next unless match(sought_for_path, current_path)
        return action
      end
    end

    def actions_with_same_method(documentation, method)
      documentation.find_all do |doc|
        doc['method'] == method
      end
    end

    def match(sought_for_path, current_path)
      sought_for_path.zip(current_path).all? do |p|
        p[0] == p[1] || (p[1][0] == '{' && p[1][-1] == '}')
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tomogram_routing-0.1.1 lib/tomogram_routing/tomogram.rb
tomogram_routing-0.1.0 lib/tomogram_routing/tomogram.rb