Sha256: b5c7b1847f90036f5502a877d5423e9d00f34be7139e24491fb852a6a67c1512

Contents?: true

Size: 1.77 KB

Versions: 11

Compression:

Stored size: 1.77 KB

Contents

# frozen_string_literal: true

module Katalyst
  module Tables
    module Collection
      module Query
        class Parser # :nodoc:
          # query [StringScanner]
          attr_accessor :query
          attr_reader :collection, :untagged, :tagged

          def initialize(collection)
            @collection = collection
            @tagged = {}
            @untagged = []
          end

          # @param query [String]
          def parse(query)
            @query = StringScanner.new(query)

            until @query.eos?
              skip_whitespace

              # break to ensure we don't loop indefinitely on bad input
              break unless take_tagged || take_untagged
            end

            self
          end

          def token_at_position(position:)
            tagged.values.detect { |v| v.range.cover?(position) } ||
              untagged.detect { |v| v.range.cover?(position) }
          end

          private

          def skip_whitespace
            query.scan(/\s+/)
          end

          def take_tagged
            start = query.charpos

            return unless query.scan(/(\w+(\.\w+)?):/)

            key, = query.values_at(1)
            skip_whitespace

            tagged[key] = value_parser(key, start).parse(query)
          end

          def take_untagged
            start = query.charpos

            return unless query.scan(/\S+/)

            untagged << UntaggedLiteral.new(value: query.matched, start:)

            untagged
          end

          using Type::Helpers::Extensions

          def value_parser(key, start)
            if query.check(/#{'\['}\s*/)
              ArrayValueParser.new(key:, start:)
            else
              SingleValueParser.new(key:, start:)
            end
          end
        end
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
katalyst-tables-3.8.0 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.7.0 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.6.2 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.6.1 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.6.0 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.5.5 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.5.4 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.5.3 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.5.2 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.5.1 app/models/concerns/katalyst/tables/collection/query/parser.rb
katalyst-tables-3.5.0 app/models/concerns/katalyst/tables/collection/query/parser.rb