Sha256: ab8859e3ab9a9e0ee3159ae63ac983879f3a7f561f498e8f4ec40d6177847996

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

module JSONAPI
  class PathSegment
    def self.parse(source_resource_klass:, segment_string:, parse_fields: true)
      first_part, last_part = segment_string.split('#', 2)
      relationship = source_resource_klass._relationship(first_part)

      if relationship
        if last_part
          unless relationship.resource_types.include?(last_part)
            raise JSONAPI::Exceptions::InvalidRelationship.new(source_resource_klass._type, segment_string)
          end
          resource_klass = source_resource_klass.resource_klass_for(last_part)
        end
        return PathSegment::Relationship.new(relationship: relationship, resource_klass: resource_klass)
      else
        if last_part.blank? && parse_fields
          return PathSegment::Field.new(resource_klass: source_resource_klass, field_name: first_part)
        else
          raise JSONAPI::Exceptions::InvalidRelationship.new(source_resource_klass._type, segment_string)
        end
      end
    end

    class Relationship
      attr_reader :relationship

      def initialize(relationship:, resource_klass:)
        @relationship = relationship
        @resource_klass = resource_klass
      end

      def to_s
        @resource_klass ? "#{relationship.name}##{resource_klass._type}" : "#{relationship.name}"
      end

      def resource_klass
        @resource_klass || @relationship.resource_klass
      end

      def path_specified_resource_klass?
        !@resource_klass.nil?
      end
    end

    class Field
      attr_reader :resource_klass, :field_name

      def initialize(resource_klass:, field_name:)
        @resource_klass = resource_klass
        @field_name = field_name
      end

      def delegated_field_name
        resource_klass._attribute_delegated_name(field_name)
      end

      def to_s
        # :nocov:
        field_name.to_s
        # :nocov:
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
jsonapi-resources-0.10.0.beta2 lib/jsonapi/path_segment.rb