Sha256: d94208bd7c011019896cc81e31a48a980519511c751bf458b4b94c2e31e9880d

Contents?: true

Size: 1.2 KB

Versions: 3

Compression:

Stored size: 1.2 KB

Contents

module LinkHeaderParser
  class LinkHeadersCollection
    extend Forwardable

    include Enumerable

    def_delegators :members, :[], :<<, :each, :last, :length, :push

    attr_reader :headers

    # @param headers [Array<String>]
    # @param base [String]
    def initialize(*headers, base:)
      @headers = headers.flatten
      @base = base

      discrete_headers.each { |header| push(LinkHeader.new(header, base: base)) }
    end

    # @return [Hash{Symbol => Array<LinkHeaderParser::LinkHeader>}]
    def group_by_relation_type
      relation_types.map do |relation_type|
        [relation_type, find_all { |member| member.relation_types.include?(relation_type) }]
      end.to_h.transform_keys(&:to_sym)
    end

    def inspect
      format(%(#<#{self.class.name}:%#0x headers: #{headers.inspect}, relation_types: #{relation_types.inspect}>), object_id)
    end

    # @return [Array<String>]
    def relation_types
      @relation_types ||= flat_map(&:relation_types).uniq.sort
    end

    private

    attr_reader :base

    def discrete_headers
      @discrete_headers ||= headers.flat_map { |header| header.split(/,(?=[\s|<])/) }.map(&:strip)
    end

    def members
      @members ||= []
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
link-header-parser-2.2.0 lib/link_header_parser/link_headers_collection.rb
link-header-parser-2.1.0 lib/link_header_parser/link_headers_collection.rb
link-header-parser-2.0.0 lib/link_header_parser/link_headers_collection.rb