Sha256: 9cd432d58a4df91b55997e4a1cf525c919dc873e018bab732311bdac3a51036d

Contents?: true

Size: 1.92 KB

Versions: 7

Compression:

Stored size: 1.92 KB

Contents

module Kanpachi
  # Class to keep track of all defined resources
  #
  # @api public
  class ResourceList
    class UnknownResource < StandardError; end
    class DuplicateResource < StandardError; end

    def initialize
      @list = {}
    end

    # Returns a hash of resources
    #
    # @return [Hash<Kanpachi::Resource>] All the added resources.
    # @api public
    def to_hash
      @list
    end

    # Returns an array of resources
    #
    # @return [Array<Kanpachi::Resource>] List of added resources.
    # @api public
    def all
      @list.values
    end

    # Add a resource to the list
    #
    # @param [Kanpachi::Resource] The resource to add.
    # @return [Hash<Kanpachi::Resource>] All the added resources.
    # @raise DuplicateResource If a resource is being duplicated.
    # @api public
    def add(resource)
      if @list.key? resource.route
        raise DuplicateResource, "A resource accessible via #{resource.http_verb} #{resource.url} already exists"
      end
      @list[resource.route] = resource
    end

    # Returns a resource based on its name
    #
    # @param [String] name The name of the resource you are looking for.
    # @raise [UnknownResource] if a resource with the passed name isn't found.
    # @return [Kanpachi::Resource] The found resource.
    #
    # @api public
    def named(name)
      resource = all.detect { |resource| resource.name == name }
      if resource.nil?
        raise UnknownResource, "Resource named #{name} doesn't exist"
      else
        resource
      end
    end

    # Returns a resource based on its verb and url
    #
    # @param [String] verb The request method (GET, POST, PUT, DELETE)
    # @param [String] url The url of the resource you are looking for.
    # @return [Nil, Kanpachi::Resource] The found resource.
    #
    # @api public
    def find(verb, url)
      http_verb = verb.to_s.upcase
      route = "#{http_verb} #{url}"
      @list[route]
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
kanpachi-0.0.7 lib/kanpachi/resource_list.rb
kanpachi-0.0.6 lib/kanpachi/resource_list.rb
kanpachi-0.0.5 lib/kanpachi/resource_list.rb
kanpachi-0.0.4 lib/kanpachi/resource_list.rb
kanpachi-0.0.3 lib/kanpachi/resource_list.rb
kanpachi-0.0.2 lib/kanpachi/resource_list.rb
kanpachi-0.0.1 lib/kanpachi/resource_list.rb