Sha256: dd1f1f27727fe2ea5947716b9aaf2527f36594a2176e06879b9341c80c0c5033

Contents?: true

Size: 1.09 KB

Versions: 3

Compression:

Stored size: 1.09 KB

Contents

require 'dentaku/tokenizer'

module Dentaku
  class Expression
    attr_reader :tokens

    def initialize(string, variables={})
      @raw = string
      @tokenizer ||= Tokenizer.new
      @tokens = @tokenizer.tokenize(@raw)
      replace_identifiers_with_values(variables)
    end

    def identifiers
      @tokens.select { |t| t.category == :identifier }.map { |t| t.value }
    end

    def unbound?
      identifiers.any?
    end

    private

    def replace_identifiers_with_values(variables)
      @tokens.map! do |token|
        if token.is?(:identifier)
          replace_identifier_with_value(token, variables)
        else
          token
        end
      end
    end

    def replace_identifier_with_value(token, variables)
      key = token.value.to_sym

      if variables.key? key
        value = variables[key]
        type  = type_for_value(value)

        Token.new(type, value)
      else
        token
      end
    end

    def type_for_value(value)
      case value
      when String then :string
      when TrueClass, FalseClass then :logical
      else :numeric
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dentaku-1.2.1 lib/dentaku/expression.rb
dentaku-1.2.0 lib/dentaku/expression.rb
dentaku-1.1.0 lib/dentaku/expression.rb