Sha256: ba51983f716f3ae4c2d7e5b198ddf9f4f7aa4bb26009650e0e27a2df0c5f795a

Contents?: true

Size: 1.69 KB

Versions: 8

Compression:

Stored size: 1.69 KB

Contents

module Eye::Dsl::Validation
  class Error < Exception; end

  def inherited(subclass)
    subclass.validates = self.validates.clone
    subclass.should_bes = self.should_bes.clone
    subclass.defaults = self.defaults.clone
    subclass.variants = self.variants.clone
  end

  attr_accessor :validates, :should_bes, :defaults, :variants

  def validates; @validates ||= {}; end
  def should_bes; @should_bes ||= []; end
  def defaults; @defaults ||= {}; end
  def variants; @variants ||= {}; end

  def param(param, types = [], should_be = false, default = nil, _variants = nil)
    param = param.to_sym

    validates[param] = types
    should_bes << param if should_be
    defaults[param] = default
    variants[param] = _variants

    define_method "#{param}" do
      @options[param.to_sym] || default
    end
  end

  def validate(options = {})    
    options.each do |param, value|        
      param = param.to_sym
      types = validates[param]
      unless types
        if param != :type
          raise Error, "#{self.name} unknown param :#{param} value #{value.inspect}" 
        end
      end

      if self.variants[param]
        if value && !value.is_a?(Proc) && !self.variants[param].include?(value)
          raise Error, "#{value.inspect} should within #{self.variants[param].inspect}" 
        end
      end

      next if types.blank?

      types = Array(types)
      good = types.any?{|type| value.is_a?(type) }
      raise Error, "#{self.name} bad param :#{param} value #{value.inspect}, type #{types.inspect}" unless good
    end

    should_bes.each do |param|
      raise Error, "#{self.name} for param :#{param} value should be" unless options[param.to_sym] || defaults[param.to_sym]
    end
  end

end

Version data entries

8 entries across 8 versions & 2 rubygems

Version Path
reel-eye-0.3.2 lib/eye/dsl/validation.rb
eye-0.3.2 lib/eye/dsl/validation.rb
reel-eye-0.3.1 lib/eye/dsl/validation.rb
eye-0.3.1 lib/eye/dsl/validation.rb
eye-0.3 lib/eye/dsl/validation.rb
eye-0.2.4 lib/eye/dsl/validation.rb
eye-0.2.3 lib/eye/dsl/validation.rb
eye-0.2.2 lib/eye/dsl/validation.rb