Sha256: 560869031ea74dff19418b0f0209d5a7e26c21be653e92f397342d61ad276333

Contents?: true

Size: 1.44 KB

Versions: 4

Compression:

Stored size: 1.44 KB

Contents

module BB
  module Evaluator
    class Value
      EVALUATE_TYPES = %i(array boolean date null numeric range regexp string subquery time).freeze

      attr_reader :value, :options

      def initialize(value, options = {})
        @value   = value
        @options = options
      end

      def eval_type
        eval_types.detect { |type| send("#{type}?") }.tap do |type|
          raise UnevaluableTypeError, "unevaluable type of value: #{value} (#{value.class})" if type.nil?
        end
      end

      private

      def eval_types
        options[:eval_types] || EVALUATE_TYPES
      end

      def array?
        value.is_a?(Array) && !value.empty?
      end

      def boolean?
        value.is_a?(TrueClass) || value.is_a?(FalseClass)
      end

      def date?
        value.respond_to?(:strftime) && !value.respond_to?(:hour)
      end

      def null?
        value.nil?
      end

      def numeric?
        value.is_a?(Numeric)
      end

      def range?
        value.is_a?(Range) && !value.size.is_a?(Float)
      end

      def regexp?
        value.is_a?(Regexp)
      end

      def string?
        value.is_a?(String) || value.is_a?(Symbol)
      end

      def subquery?
        value.respond_to?(:to_sql)
      end

      def time?
        value.respond_to?(:strftime) && value.respond_to?(:hour)
      end

      class << self
        def eval_type(value, options = {})
          new(value, options).eval_type
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
b_b-0.1.3 lib/b_b/evaluator/value.rb
b_b-0.1.2 lib/b_b/evaluator/value.rb
b_b-0.1.1 lib/b_b/evaluator/value.rb
b_b-0.1.0 lib/b_b/evaluator/value.rb